小端(little-endian)
机器易于处理的字节序地址低位存储值的低位
地址高位存储值的高位
大端(big-endian)
最直观的字节序
地址低位存储值的高位
地址高位存储值的低位
说的是CPU处理数据的方式。可用C语言中的联合体union来判定当前机器的字节序,因为union是由地址低位开始分配变量的。
#include <stdio.h>
int main()
{
union u{
int a;
char b;
}c;
c.a = 0x1234;
printf("0x%x", c.b);
}
-------------------------------------------------
地址 0000 0001 0002 0003
u 0x34 0x12 0x00 0x00
u.a 0x34 0x12 0x00 0x00
u.b 0x34
-------------------------------------------------
其实,X86平台的处理器均为小端,而PowePC处理器多为大端。
PowerPC处理器多用于网络,故网络间编程时常常用到:
ntohs(n) htons(n) ntohl(n) htonl(n),来处理网络及主机间16位、32位数据的转换
大端处理器到网络是不需转换的,而小端处理器到网络需要转换,其实质 ntohs(n) = __swab16(n),ntohl = __swab32(n)
#define ___swab16(x)
{
__u16 __x = (x);
((__u16)(
(((__u16)(__x) & (__u16)0x00ffU) << 8) |
(((__u16)(__x) & (__u16)0xff00U) >> 8) ));
}
#define ___swab32(x)
{
__u32 __x = (x);
((__u32)(
(((__u32)(__x) & (__u32)0x000000ffUL) << 24) |
(((__u32)(__x) & (__u32)0x0000ff00UL) << 8) |
(((__u32)(__x) & (__u32)0x00ff0000UL) >> 8) |
(((__u32)(__x) & (__u32)0xff000000UL) >> 24) ));
}