我在位域和字节序方面遇到了麻烦...
我很困惑
我需要解析从网络获取的一些数据,发送的数据是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;
}
[输出]
00000000 00000001
00000010 00000000
最佳答案
您为什么要说第二个值是“存储良好”?查看您自己的输出:如果_LENGTH
中的第一个字段(two
)应该由9位组成,那么第二个输出也不正确。它应该是00000001 00000000
,但是您却得到了00000010 00000000
,这意味着在two
中,您的值被“乘以2”。
我猜你的bit_print
坏了,打印废话了。
(强制性免责声明:位域布局是由实现定义的。使用位域时,不能保证在C ++语言中与布局有关的任何事情。)
关于c++ - 为什么用位域将我的值除以2,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3637757/