转自:http://blog.csdn.net/peixuan197/article/details/48316389?locationNum=1
转自:http://blog.sina.com.cn/s/blog_6afeac5001010htc.html
转自:http://www.blogjava.net/tinysun/archive/2009/12/31/307952.html
网络字节序是大端
小端:较高的有效字节存放在较高的的存储器地址,较低的有效字节存放在较低的存储器地址。
大端:较高的有效字节存放在较低的存储器地址,较低的有效字节存放在较高的存储器地址。
地址偏移 | 大端模式 | 小端模式 |
---|---|---|
0x00 | 12(OP0) | 78(OP3) |
0x01 | 34(OP1) | 56(OP2) |
0x02 | 56(OP2) | 34(OP1) |
0x03 | 78(OP3) | 12(OP0) |
判断大小端的代码:
#include <stdio.h>
union X {
int i;
char ch[4];
};
int main () {
X x;
x.i = 0x12345678;
printf("要测试的字符是:0x12345678");
if(0x78 == x.ch[0] && 0x56 == x.ch[1] && 0x34 == x.ch[2] && 0x12 == x.ch[3]) {
printf("小端系统:");
printf("%x,%x,%x,%x\n,x.ch[0],x.ch[1],x.ch[2],x.ch[3]);
} else {
printf("大端系统:");
printf("%x,%x,%x,%x\n,x.ch[0],x.ch[1],x.ch[2],x.ch[3]);
}
return 0;
}
网络字节序转换:
相关函数:
* unsigned short int htons(unsigned short int hostshort):
主机字节顺序转换成网络字节顺序,对无符号短型进行操作4bytes
* unsigned long int htonl(unsigned long int hostlong):
主机字节顺序转换成网络字节顺序,对无符号长型进行操作8bytes
* unsigned short int ntohs(unsigned short int netshort):
网络字节顺序转换成主机字节顺序,对无符号短型进行操作4bytes
* unsigned long int ntohl(unsigned long int netlong):
网络字节顺序转换成主机字节顺序,对无符号长型进行操作8bytes
转换代码:
#include <stdio.h>
#include <netinet/in.h>
int main()
{
int i_num = 0x12345678;
printf("[0]:0x%x\n", *((char *)&i_num + 0));
printf("[1]:0x%x\n", *((char *)&i_num + 1));
printf("[2]:0x%x\n", *((char *)&i_num + 2));
printf("[3]:0x%x\n", *((char *)&i_num + 3));
i_num = htonl(i_num);
printf("[0]:0x%x\n", *((char *)&i_num + 0));
printf("[1]:0x%x\n", *((char *)&i_num + 1));
printf("[2]:0x%x\n", *((char *)&i_num + 2));
printf("[3]:0x%x\n", *((char *)&i_num + 3));
return 0;
}
在80X86CPU平台上,执行该程序得到如下结果:
[0]:0x78
[1]:0x56
[2]:0x34
[3]:0x12
[0]:0x12
[1]:0x34
[2]:0x56
[3]:0x78