我遇到了bitfields和endian东西的麻烦...... 我很困惑。
我需要解析一些从网络中获取的数据,发送的是lil endian(即使用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;
}
[OUTPUT]
00000000 00000001
00000010 00000000
答案 0 :(得分:3)
为什么你说第二个值是“存储良好”?查看您自己的输出:如果_LENGTH
中的第一个字段(two
)应该由9位组成,那么第二个输出也是错误的。它应该是00000001 00000000
,而是你得到00000010 00000000
,这意味着在two
中你的价值被“乘以”2。
我猜你的bit_print
已被打破并打印废话。
(强制性免责声明:位字段布局是实现定义的。当您使用位字段时,不能保证C ++语言中与布局相关的任何内容。)