您的位置:首页 > 其它

字节序、比特序(二)----结构体的传输

2015-12-13 21:52 246 查看
1. 字节序与大小端

考虑下面的代码段:

int test_data = 0x12345678;


如果在小端机上直接将test_data发送出去,在大端机上得到的int型数据将是0x78563412。

无论是大端机还是小端机,数据发送的时候都是从低地址发送的。上面代码段在小端机上,数据最低位0x78是存放在低地址的,最先发送;数据最高位0x12是存放在高地址的,最后发送。在大端机接收的时候,先收到的0x78放在低地址,最后收到的0x12放在高地址,做数据解析的时候,由于大端机认为高位在低地址,所以会解析成0x78563412。

可以看出,无论是在大端机还是小端机,从低地址到高地址,存放的数据都是0x78 0x56 0x34 0x12。所以我们可以认为socket收发数据就是内存拷贝。

2. 位域与大小端

考虑下面的代码段:

struct bit_test
{
char bit1:4;
char bit2:4;
};

union endian_test
{
char c;
struct bit_test bit_info;
};

union endian_test test_data;
test_data.c = 0x12;


C语言的结构体中如果包含了位域,如果位域A定义在位域B之前,那么位域A总是出现在低地址的比特位;而小端机的低地址存放的是数据的低位。所以,在小端机上,bit1 的数值是2,bit2的数值是1。

如果我们直接通过socket将test_data发送到一个大端机上(不经过网络序转换),那么,test_data.c的数值是0x12(由于是单字节,所以不会出问题),而test_data.bit_info.bit1的值则是0x1, test_data.bit_info.bit2的值则是0x2.

这是由于,在大端机上,低地址存放的是数据的高位,高地址是数据的低位。bit1是低地址,bit2是高地址。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: