一.字节序
二.大端字节序和小端字节序
1.brief
2.字节序的表示方法有两种:
1>小端字节序(Little Endian):在表示变量的内存起始地址存放底字节,高字节顺序存放
2>大端字节序(Big Endian):在表示变量的内存起始地址存放高字节,底字节顺序存放。
3实例:
一个变量的值为0xabcd,在大端字节序和小端字节序的系统中两者的存放顺序是不同的.
1>在小端字节系统中的存放顺序如图:
![网络字节序](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
0xab在地址15~8的地址上,而0xcd在地址7~0的位置上。
2>在大端字节序系统中的存放顺序如图:
4.程序实例:
可以编写程序来检测下变量在内存中的表示形式,以确定系统中的字节序为大端字节序还是小端字节序。
(1)字节序结构:
程序先建立一个公用体类型address,用于测试字节序,成员value是int 类型变量,可以通过成员byte来访问value变量的高字节和低字节。
typedef union{
}addr;
(2)变量声明,声明一个to类型的变量typeordr,给变量value赋值为0xabcd,由于在类型addr中,value和byte成员共享同一块内存,所以可以通过byte的不同成员来访问value的高字节和低字节。
(3)程序:
int main(int argc,char *argv)
{
}
5.进行网络字节序转换的函数有htons,htonl,ntohs(),ntohl()等,其中s表示short数据类型,l是long数据类型的意思,h是host既主机的意思,n是network即网络的意思。
1>htons(host to net short):表示对short类型的变量,从主机字节序转换为网络字节序。
2>ntohs(net to host short):表示对short类型的变量,从网络字节序转换为主机字节序。
3>htonl(host to net long):表示对long类型的变量,从主机字节序转换为网络字节序
4>ntohl(net to host long):表示对long类型的变量,从网络字节序转换为主机字节序。
6.由于在网络中网络字节序采用高端字节序的表示方法。因此字节序转换函数在不同平台上的实现是不同的,在小端主机字节序的平台要进行转换,而在大端主机字节序的平台上是不需要进行转换的。
例如:通过下面的实现方式可以兼容不同的平台:
#if
long
{
Return ((value << 24) |
}
#else if
long
{
}
#endif