前提・実現したいこと
バイナリデータを読み込みたいです。
バイナリデータ構造
発生している問題・エラーメッセージ
固定長であればキャストで簡単に読み込めると思いますが、可変長になっているので単純なキャストでは「ズレ」が発生して上手く読み込めません。
固定長にしたいところですが元のバイナリデータは変更不可能です。
可変長のバイナリデータの場合どのように読み込む方法があるでしょうか?
該当のソースコード
cpp
#include <iostream> #pragma pack(1) struct User { uint8_t id; uint8_t name_length; char *name; uint8_t age; }; struct Users { uint8_t length; User info[]; }; #pragma pack() int main() { uint8_t data[] = { 0x02, 0x01, 0x07, 0x74, 0x61, 0x6E, 0x61, 0x6B, 0x61, 0x31, 0x01, 0x02, 0x08, 0x74, 0x61, 0x6E, 0x61, 0x6B, 0x61, 0x31, 0x31, 0x02 }; auto users = reinterpret_cast<Users*>(data); std::printf("userInfos.length: %d\n", users->length); for (auto i = 0; i < users->length; i++) { auto user = reinterpret_cast<User*>(&users->info[i]); auto id = user->id; auto nameLength = user->name_length; std::string name(reinterpret_cast<char*>(&user->name), nameLength); auto age = user->age; std::printf("Id: %d\n", id); std::printf("名前の長さ: %d\n", nameLength); std::printf("名前: %s\n", name.c_str()); std::printf("年齢: %d\n", age); } return 0; }
出力
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
まだ回答がついていません
会員登録して回答してみよう