反转字节序之大小端转换
什么是大端和小段?
举个例子,比如int类型的数:0x12345678在内存中的表现形式。
1)大端模式:Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。
低地址 --------------------> 高地址
0x12 | 0x34 | 0x56 | 0x78
2)小端模式:Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
低地址 --------------------> 高地址
0x78 | 0x56 | 0x34 | 0x12
代码
1、检测大小端
int isBigEndian(void)
{
int val = 0x12345678;
char ch = *((char *)&val);
return ch == 0x12 ? 1 : 0;
}
2、字节序反转
(1)int类型转换
u32 swap_uint32(u32 val)
{
return (((val << 24) & 0xFF000000) | ((val << 8) & 0x00FF0000) | ((val >> 8) & 0x0000FF00) | ((val >> 24) & 0x000000FF));
}
(2)short类型转换
u16 swap_uint16(u16 val)
{
return (((val << 8) & 0xFF00) | ((val >> 8) & 0x00FF));
}
ends…