字节序:cpu对内存中数据以字节为单位进行存取的顺序。
主机字节序分为:
- 大端字节序:低地址存高位。
- 小端字节序:低地址存低位
地址指内存地址;在内存中,一块空间的起始地址为低地址。比如int a[10],其中a[0]为低地址。
位表示二进制比特位;左边为高为,右边为地位。如inta=1; —> 0x00000001,其中1为低位。
eg:int a =ox01020304 ,则它的大小端存储内存情况分别如下:
一个主机的字节序为大端还是小端字节序取决于cpu架构:
- x86/x86_64――>小端;
- MIPS―――>大端
主机字节序对于网络通信的影响:两端主机字节序不同有可能会造成数据二义;
解决方案: 定义网络通信字节序标准,网络通信字节序为大端字节序。
不管主机是什么字节序,网络中数据必须是网络字节序,两端主机根据自己的主机字节序进行数据转换即可。
字节序所针对的数据类型:存储单元大于一个字节的数据类型。short,int,long,float,double…
单字节存储(char)不涉及字节序问题。
所以网络通信时,存储单元大于一个字节的基础数据类型数据都要进行字节序转换;使用网络字节序,这样程序的可移植性较好。
编写一个程序判断当前主机的字节序:
int a=1;
char *b=(char*)&a;
if(*b==1){ //小端 }
else {//大端}
或者用联合体(所有成员公用一块空间):
union{int a; char b;} tmp;
tmp.a=1;
if(tmp.b==1){ //小端 }
else {//大端}