大小端

废弥 于 2014-09-20 发布
定义
缘由

因CPU硬件不同,使用的存储字节顺序可能不同,分为大端和小端,所以大小端其实将的就是字节序。为了在网络传输中,不同的硬件可以相互通信,TCP/IP 协议规定使用大端模式(Big-Endian).因TCP/IP协议族是用来解决网络通信的,所以TCP/IP协议中使用的字节序通常称之为网络字节序

构架

字节序按照CPU架构分:

示例

int型的整数在计算机中占4个字节,整数0x01020304的两种表示方法:

低地址———–>高地址

04 03 02 01 —>方法1:小端模式(高字节放到低地址上)
01 02 03 04 —>方法2:大端模式(高字节放到高地址上) 网络字节序
判断大小端
bool isBigEndian()  
{  
    union
    {  
        int a;  
        char b;  
    }num;  
    num.a = 0x1234;  
    return ( num.b == 0x12 )   
}
转换
1. 宏处理
#define __SWP16(A) (( ((uint16)(A) & 0xff00) >> 8) | (( (uint16)(A) & 0x00ff) << 8))  
#define __SWP32(A) ((( (uint32)(A) & 0xff000000) >> 24) | (( (uint32)(A) & 0x00ff0000) >> 8) | (( (uint32)(A) & 0x0000ff00) << 8) | (( (uint32)(A) & 0x000000ff) << 24)) 
2. linux的4个转换函数
uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);

短型(两个字节)和长型(四个字节)

什么时候考虑大小端问题