ソケットCを介して送信されたとき、私は次のようなビットフィールドがあります。ビットフィールド値の変更++
typedef struct __attribute__((__packed__)) MyStruct {
unsigned int val1:14;
unsigned int val2:1;
unsigned int val3:1;
unsigned int val4:1;
unsigned int val5:1;
unsigned short aFullShort;
unsigned int aFullInt;
} MyStruct;
私は、ネットワークを介してこれらの値を送信していますし、時には送信者がval1
が(設定されていると思いますことに気づいたが送信前に値を印刷することによって検証可能ですが、受信者はval1
が設定されていることを認識しません)。次のように送信するためのコードは次のとおり
MyStruct* myStruct = new MyStruct(); //initialize fields here
sendto(sock, myStruct, sizeof(MyStruct), 0, ...);
読み取りのためのコードは次の通りである:
unsigned char theBuffer[sizeof(MyStruct)];
recvfrom(aSocket, &theBuffer, sizeof(theBuffer), 0, ...);
ソケットからバイトを読み取った後、私はMyStruct
にバイトキャスト再解釈とエンディアン行いますaFullShort
およびaFullInt
の変換。送信者がそれを1に設定したときに受信者がval1
が0であると受信者が判断するように破損が発生します。なぜこれが起こりますか?コンパイラが送信側と受信側の異なるパディングを挿入している可能性がありますか?単一のビット値のエンディアンを心配する必要がありますか?
送信者/受信者はOSと全く同じコンパイラです。ビットフィールドレイアウトは実装定義です。 –
@RichardCritten送信者と受信者は同じホストで実行され、同じコンパイラを使用してコンパイルされます。 2つの別個のバイナリが送信者と受信者に対して作成されます。これにより、コンパイラは2つのターゲットに対して異なる最適化を行うことができます。 – user1832287
送信者の '(char *)(void *)myStruct'と受信者の' theBuffer'のダンプをダンプします。バイトは同じですか?そうであれば、構造のレイアウトの違いを指し示します。 – ikegami