次の形式で送信する 12 バイトのパケットがあります。
+--------+------+ | | ID | 版 | +--------+------+
ID は 8 バイト、ver は 4 バイトです。以下のように構造体を宣言しましたが、私の PC は 16 バイト (8 + 4 + 4 バイトのパディング) のサイズ値を与えます。#pragma
問題は解決したのですが、解決する方法はありますか?
struct pak
{
char *ID;
uint32_t ver;
};
次の形式で送信する 12 バイトのパケットがあります。
+--------+------+ | | ID | 版 | +--------+------+
ID は 8 バイト、ver は 4 バイトです。以下のように構造体を宣言しましたが、私の PC は 16 バイト (8 + 4 + 4 バイトのパディング) のサイズ値を与えます。#pragma
問題は解決したのですが、解決する方法はありますか?
struct pak
{
char *ID;
uint32_t ver;
};
最も一般的で、移植性があり、誤りのない解決策は、パディングをまったく気にしないことです。
構造体をそのまま送信する代わりに、たとえばmemcpy
.
他のデバイスにデータを送信するときは、エンディアンを忘れないntohl
でください。詳細については、およびドキュメントをntohs
参照してください。
あなたのプラットフォームは8バイト境界に構造を揃えているようです。gcc にはこれを変更するオプションがあります。4 バイト境界でパックする場合は、-fpack-struct=4 オプションを有効にしてコンパイルします。ただし、メモリ割り当てが遅くなる可能性があることに注意してください。(詳細については、gcc マニュアルを参照してください)
char ポインターを使用する代わりにプラットフォームに依存するコードを記述していない場合は、uint64_t を使用できます。32 ビット プラットフォームでは 4 バイトのポインターが提供されることを忘れないでください。
struct pak
{
char *ID;
uint32_t ver;
}__attribute__((packed));
余分なパディングがない場合は上記を使用してください。