0

ビットフィールドとエンディアンで問題が発生しました...混乱しました。

ネットワークから取得したデータを解析する必要があります。送信されたデータはリル エンディアンです (boost::asio を使用しています)。

これについて説明してもらえますか

struct TEST
{
 unsigned short _last : 1;
 unsigned short _ID : 6;
 unsigned short _LENGH : 9;

};
struct TEST2
{
 unsigned short _LENGH:9 ;
 unsigned short _ID:6 ;
 unsigned short _last:1 ;
};


int main(int argc, char* argv[])
{
 printf("Hello World!\n");

 TEST one;
 one._ID    = 0;
 one._last  = 0;
 one._LENGH = 2; //the value affected here is always divided by 2, it is multiplied by 2 when i cast a short to this structure

 TEST2 two;
 two._ID   =  0;
 two._last  = 0;
 two._LENGH = 2; //the value here is well stored


 bit_print((char*)&one,2);
 bit_print((char*)&two,2);
 return 0;
}

[出力]

00000000 00000001

00000010 00000000

4

1 に答える 1

3

2番目の値が「適切に保存されている」と言っているのはなぜですか? 独自の出力を見てください。最初のフィールド ( _LENGTH)twoが 9 ビットで構成されると想定されている場合、2 番目の出力も正しくありません。であるはずでしたが00000001 00000000、代わりに になりました。これは、値が 2 倍された00000010 00000000ことを意味します。two

bit_printあなたは壊れていて、ナンセンスを印刷していると思います。

(必須の免責事項: ビット フィールド レイアウトは実装定義です。ビット フィールドを操作する場合、C++ 言語でのレイアウト関連は保証されません。)

于 2010-09-03T16:49:56.493 に答える