考虑一个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
时间: 2024-10-26 08:54:20