大端和小端
- 大端法:高位保存在低地址中
- 小端法:高位存放在高地址中
大端和小端法对程序的影响
字节序不是由操作系统决定,而是由cpu架构决定的
比如 x86 的是小端序,而 PPC (PowerPC) 是big endian,所以跑在 x86 上的 linux/windows 都是小端,而跑在 PPC 上的linux则是大端。网络字节序为大端
程序判断大端法还是小端法
#include <stdio.h>
int main(int argc, char **argv)
{
union {
short s;
char c[sizeof(short)];
} un;
un.s = 0x0102;
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("not known\n");
}
else
{
printf("sizeof(short) = %d\n", sizeof(short));
}
}
网络编程中常用的字节序转换函数有如下几个:
#include <<netinet/in.h>>
uing16_t htons(uint16_t host16bitvalue); // 参数为16位主机字节序的值,返回值是16位网络字节序的值
uint32_t htonl(uint32_t host32bitvalue); // 参数为32位主机字节序的值,返回值是32位网络字节序的值
uint16_t ntohs(uint16_t net16bitvalue); // 参数为16位网络字节序的值,返回值是16位主机字节序的值
uint32_t ntohl(uint32_t net32bitvalue); // 参数为16位网络字节序的值,返回值是16位主机字节序的值