考虑一个16位整数,它由2个字节组成。内存中存储这2个字节有2种方法:
一种是将低序字节存储在起始地址,称为小端(little-endian)字节序
另一种方法是将高序字节存储在起始地址,称为大端(big-endian)字节序
我们把系统所采用的字节序称为主机自己序(host byte order)
#include "unp.h"
int
main(int argc, char **argv)
{
union {
short s;
char c[sizeof(short)];
} un;
un.s = 0x0102;
printf("%s: ", CPU_VENDOR_OS);
if (sizeof(short) == 2) {
if (un.c[0] == 1 && un.c[1] == 2)
printf("big-endian\n");
else if (un.c[0] == 2 && un.c[1] == 1)
printf("little-endian\n");
else
printf("unknown\n");
} else
printf("sizeof(short) = %d\n", sizeof(short));
exit(0);
}
当一个短整数变量中存放2个字节的值0x0102,然后查看它的两个连续字节c[0]和c[1],以此确定字节序
字符串CPU_VENDOR_OS标识CPU类型、厂家和操作系统版本
既然网络协议必须指定一个网络字节序(network byte order),作为网络编程人员必须清楚不同字节序的差异
网际协议使用大端字节序来传送这些多字节整数
主机字节序和网络字节序的转换:
h:host
n:network
s:short
l:long
返回网络字节序的函数:
uint16_t htons(uint16_t host16bitvalue);
uint32_t htonl(uint32_t host32bitvalue);
返回主机字节序的函数:
uint16_t ntohs(uint16_t net16bitvalue);
uint32_t ntohl(uint32_t net32bitvalue);
因特网标准中另一个重要的约定就是位序
最左边的位是最早出现的最高有效位
注意位序的编号是从0开始的,分配给最高有效位的编号是0
原文:http://www.cnblogs.com/ailx10/p/5347464.html