餃子を食べるとき、何をつけますか?

こんばんは。

すみません。文字操作?ポインタ操作が苦手なので教えてください。

以下のような構造体があり、その構造体から1バイトずつ読み出して
自作の関数のパラメータ(1バイト指定領域)に渡したいのですが、
構造体から1バイトずつデータを読み出すには、どのようにすればいいのでしょうか?

typedef struct {
PACKET_HEADERhead;
unsigned charSp_Pr_St[1];
unsigned charctrl_flow[1];
unsigned charproduct_org[10];
unsigned charproduct_name[10];
unsigned charproduct_ver[3];
}PRODUCT_RESPONS;

typedef struct {
unsigned char head;
unsigned char type;
unsigned char data_len;
} HEADER;

どうぞよろしくお願いします。

A 回答 (4件)

char系 しか利用していない構造体はかならず、先頭から宣言した順序でメモリ配置されます。


また、アライメントの調整もされないです。(言語仕様の特例)

なので、この構造体ならば #1 に一票。

int とか long を含んだ場合、とたんに破綻するのでご注意。
# まぁPACKETというあたりそんな変数は出てこないと思いますが。。
    • good
    • 0

ファイルフォーマットかなんかでしょうか?


それでしたら、構造体は不向きです。
パディングやエンディアンの問題があります。

ファイルポインタ等から、任意のバイトを取得する関数を作って地道に処理をするほうが結局のところ近道ですよ。
    • good
    • 0

例にあるような、別々の名前をつけて定義された変数の、メモリ上での並びの連続性は、特別な場合(文字列の定義など)以外、構造体の中ででも保証されません。

パディングと言って、CPUのメモリアクセス効率・制限などの理由により、間に空白(未使用領域)が挿入されることがあります。ですから共用体にしても変わりありません。
「名前」でそれぞれのアクセスにするべきです。
    • good
    • 0

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];

まあ、うまくできるかどうか分かりませんが、参考にしていただければ幸いです。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報