前提・実現したいこと
バイナリデータを読み込みたいです。
バイナリデータ構造
発生している問題・エラーメッセージ
固定長であればキャストで簡単に読み込めると思いますが、可変長になっているので単純なキャストでは「ズレ」が発生して上手く読み込めません。
固定長にしたいところですが元のバイナリデータは変更不可能です。
可変長のバイナリデータの場合どのように読み込む方法があるでしょうか?
該当のソースコード
cpp
1#include <iostream> 2 3#pragma pack(1) 4struct User 5{ 6 uint8_t id; 7 uint8_t name_length; 8 char *name; 9 uint8_t age; 10}; 11 12struct Users 13{ 14 uint8_t length; 15 User info[]; 16}; 17#pragma pack() 18 19int main() 20{ 21 uint8_t data[] = { 22 0x02, 23 0x01, 0x07, 0x74, 0x61, 0x6E, 0x61, 0x6B, 0x61, 0x31, 0x01, 24 0x02, 0x08, 0x74, 0x61, 0x6E, 0x61, 0x6B, 0x61, 0x31, 0x31, 0x02 25 }; 26 27 auto users = reinterpret_cast<Users*>(data); 28 std::printf("userInfos.length: %d\n", users->length); 29 30 for (auto i = 0; i < users->length; i++) 31 { 32 auto user = reinterpret_cast<User*>(&users->info[i]); 33 34 auto id = user->id; 35 auto nameLength = user->name_length; 36 std::string name(reinterpret_cast<char*>(&user->name), nameLength); 37 auto age = user->age; 38 39 std::printf("Id: %d\n", id); 40 std::printf("名前の長さ: %d\n", nameLength); 41 std::printf("名前: %s\n", name.c_str()); 42 std::printf("年齢: %d\n", age); 43 } 44 45 return 0; 46}
出力
userInfos.length: 2 Id: 1 名前の長さ: 7 名前: tanaka1 年齢: 107 Id: 97 名前の長さ: 49 名前: tanaka11フフフフフフ"跳4戍ル 年齢: 97
期待する出力
userInfos.length: 2 Id: 1 名前の長さ: 7 名前: tanaka1 年齢: 1 Id: 2 名前の長さ: 8 名前: tanaka11 年齢: 2
補足情報(FW/ツールのバージョンなど)
- C++17
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/10/27 09:01