• 締切済み

1バイトデータの読み出しについて

こんばんは。 すみません。文字操作?ポインタ操作が苦手なので教えてください。 以下のような構造体があり、その構造体から1バイトずつ読み出して 自作の関数のパラメータ(1バイト指定領域)に渡したいのですが、 構造体から1バイトずつデータを読み出すには、どのようにすればいいのでしょうか? typedef struct { PACKET_HEADER head; unsigned char Sp_Pr_St[1]; unsigned char ctrl_flow[1]; unsigned char product_org[10]; unsigned char product_name[10]; unsigned char product_ver[3]; }PRODUCT_RESPONS; typedef struct { unsigned char head; unsigned char type; unsigned char data_len; } HEADER; どうぞよろしくお願いします。

みんなの回答

回答No.4

char系 しか利用していない構造体はかならず、先頭から宣言した順序でメモリ配置されます。 また、アライメントの調整もされないです。(言語仕様の特例) なので、この構造体ならば #1 に一票。 int とか long を含んだ場合、とたんに破綻するのでご注意。 # まぁPACKETというあたりそんな変数は出てこないと思いますが。。

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.3

ファイルフォーマットかなんかでしょうか? それでしたら、構造体は不向きです。 パディングやエンディアンの問題があります。 ファイルポインタ等から、任意のバイトを取得する関数を作って地道に処理をするほうが結局のところ近道ですよ。

回答No.2

例にあるような、別々の名前をつけて定義された変数の、メモリ上での並びの連続性は、特別な場合(文字列の定義など)以外、構造体の中ででも保証されません。パディングと言って、CPUのメモリアクセス効率・制限などの理由により、間に空白(未使用領域)が挿入されることがあります。ですから共用体にしても変わりありません。 「名前」でそれぞれのアクセスにするべきです。

回答No.1

union を使えばいいのではないでしょうか? union byte_array { unsigned char bytes[28]; PRODUCT_RESPONS; }; PRODUCT_RESPONS pr; union byte_array bu; bu.PRODUCT_RESPONS = pr; bu.bytes[0]; bu.bytes[1]; bu.bytes[2]; あるいは、単純にポインタにキャストするとかでしょうか? PRODUCT_RESPONS pr; unsigned char *bp; bp = (unsigned char *)≺ bp[0]; bp[1]; bp[2]; まあ、うまくできるかどうか分かりませんが、参考にしていただければ幸いです。

関連するQ&A

専門家に質問してみよう