1

次の形式で送信する 12 バイトのパケットがあります。

+--------+------+
| | ID | 版 |
+--------+------+

ID は 8 バイト、ver は 4 バイトです。以下のように構造体を宣言しましたが、私の PC は 16 バイト (8 + 4 + 4 バイトのパディング) のサイズ値を与えます。#pragma問題は解決したのですが、解決する方法はありますか?

struct pak
{
  char *ID;
  uint32_t ver;
};
4

3 に答える 3

5

最も一般的で、移植性があり、誤りのない解決策は、パディングをまったく気にしないことです。

構造体をそのまま送信する代わりに、たとえばmemcpy.

他のデバイスにデータを送信するときは、エンディアンを忘れないntohlでください。詳細については、およびドキュメントをntohs参照してください。

于 2012-12-28T11:47:51.813 に答える
0

あなたのプラットフォームは8バイト境界に構造を揃えているようです。gcc にはこれを変更するオプションがあります。4 バイト境界でパックする場合は、-fpack-struct=4 オプションを有効にしてコンパイルします。ただし、メモリ割り当てが遅くなる可能性があることに注意してください。(詳細については、gcc マニュアルを参照してください)

char ポインターを使用する代わりにプラットフォームに依存するコードを記述していない場合は、uint64_t を使用できます。32 ビット プラットフォームでは 4 バイトのポインターが提供されることを忘れないでください。

于 2012-12-28T12:21:49.950 に答える
0
struct pak
{
  char *ID;
  uint32_t ver;
}__attribute__((packed));

余分なパディングがない場合は上記を使用してください。

于 2012-12-28T12:04:22.723 に答える