什么是大端和小端
大端小端是字节在内存中的存储的顺序。
(自己理解、方便记忆)从低地址开始到高地址,如果先存高位字节,那么就是大端模式,如果是先存低位字节,就是小端模式。当然是针对至少占用两个字节的数据来说,如果是只占用一个字节,就没有大端小端问题了。
另外网络字节顺序是大端模式。
大端小端各自优势
小端模式 :强制转换数据不需要调整字节内容,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;
}