字节序、比特序(二)----结构体的传输
2015-12-13 21:52
246 查看
1. 字节序与大小端
考虑下面的代码段:
如果在小端机上直接将test_data发送出去,在大端机上得到的int型数据将是0x78563412。
无论是大端机还是小端机,数据发送的时候都是从低地址发送的。上面代码段在小端机上,数据最低位0x78是存放在低地址的,最先发送;数据最高位0x12是存放在高地址的,最后发送。在大端机接收的时候,先收到的0x78放在低地址,最后收到的0x12放在高地址,做数据解析的时候,由于大端机认为高位在低地址,所以会解析成0x78563412。
可以看出,无论是在大端机还是小端机,从低地址到高地址,存放的数据都是0x78 0x56 0x34 0x12。所以我们可以认为socket收发数据就是内存拷贝。
2. 位域与大小端
考虑下面的代码段:
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是高地址。
考虑下面的代码段:
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是高地址。
相关文章推荐
- QT初级错误:继承于QMainwindow的窗口需调用setCentralWidget
- Jenkins学习——Jenkins是什么
- openstack python api 开发
- Android基础的sharedPreferences存储,ListView,以及httpclient,和asynchttp框架请求的使用
- uva_10922
- 命名
- Jenkins学习——Jenkins是什么
- ASP.NET学习感悟
- Android实践项目汇报(总结)-修改
- 【C++】计算所有小于N的勾股数组合,可以写入txt文件保存,每组占一行。
- 我的电磁学讲义17:电介质
- matlab:如何把一个文件夹中的所有文件名提出来
- mac 显示隐藏 隐藏文件的命令
- java自定义List链表
- RESTORE数据时10G+ASM遇到ORA-4031及ORA-00600 KSSRMP1错误
- poj 3070 Fibonacci【矩阵斐波拉切】
- Go语言中Tcp协议粘包问题处理
- linux下android 常用指令
- leetcode:118 Pascal's Triangle-每日编程第二十四题
- 虚拟存储器学习记录