
版权声明:本文为博主原创文章,转载请注明出处哦~。
什么是大端和小端
大端小端是字节在内存中的存储的顺序。
(自己理解、方便记忆)从低地址开始到高地址,如果先存高位字节,那么就是大端模式,如果是先存低位字节,就是小端模式。当然是针对至少占用两个字节的数据来说,如果是只占用一个字节,就没有大端小端问题了。
另外网络字节顺序是大端模式。
大端小端各自优势
小端模式 :强制转换数据不需要调整字节内容,1、2、4字节的存储方式一样。
大端模式 :符号位的判定固定为第一个字节,容易判断正负。
Big-Endian和Little-Endian的定义如下:
1) Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
2) Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。
举一个例子,比如数字0x12 34 56 78(占四个字节)在内存中的表示形式为:
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;
- }