Bootstrap

大端模式小端模式

什么是大端和小端
大端小端是字节在内存中的存储的顺序。
(自己理解、方便记忆)从低地址开始到高地址,如果先存高位字节,那么就是大端模式,如果是先存低位字节,就是小端模式。当然是针对至少占用两个字节的数据来说,如果是只占用一个字节,就没有大端小端问题了。
另外网络字节顺序是大端模式。
大端小端各自优势
小端模式 :强制转换数据不需要调整字节内容,1、2、4字节的存储方式一样。
大端模式 :符号位的判定固定为第一个字节,容易判断正负。

Big-Endian和Little-Endian的定义如下:
1) Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
2) Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。
举一个例子,比如数字0x12 34 56 78(占四个字节)在内存中的表示形式为:
1) Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
2) Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。
举一个例子,比如数字0x12 34 56 78在内存中的表示形式为:
1)大端模式:
低地址 —————–> 高地址
0x12 | 0x34 | 0x56 | 0x78
2)小端模式:
低地址 ——————> 高地址
0x78 | 0x56 | 0x34 | 0x12

QT中 字节顺序转换:网络字节序转换成本机字节序、本机字节序转换成网络字节序 两种转换方法相同:
如果本机不是大端模式,就交换高低位字节,如果是大端模式,直接返回不用交换字节。

ushort ntohs(ushort data)
{
    ushort outdata = data;
    if(QSysInfo::ByteOrder != QSysInfo::BigEndian)
    {
        char* pdata = (char*)&data;
        char* tdata = (char*)&outdata;
        *tdata = *(pdata+1);
        *(tdata+1) = *pdata;
    }
    return outdata;
}

qt中直接有QSysInfo::ByteOrder可以判断是否是大端模式

BOOL IsBigEndian()
{
    if(QSysInfo::ByteOrder != QSysInfo::BigEndian)
        return false;
    else
        return true;
}

c/c++中判断大端小端的方法

BOOL IsBigEndian()  //类型强制转换方法
{  
    int a = 0x1234;  
    char b =  *(char *)&a;  
//通过将int强制类型转换成char单字节,通过判断起始存储位置。即等于 取b等于a的低地址部分  
    if( b == 0x12)  
    {  
        return TRUE;  
    }  
    return FALSE;  
}
BOOL IsBigEndian()  // union 结构体方法
{  
    union NUM  
    {  
        int a;  
        char b;  
    }num;  
    num.a = 0x1234;  
    if( num.b == 0x12 )  
    {  
        return TRUE;  
    }  
    return FALSE;  
}
;