大端模式小端模式

来源:互联网 发布:淘宝流失竞店发现 编辑:程序博客网 时间:2024/06/05 09:27

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