大端模式小端模式

 

大端模式小端模式 [已删除]

标签: 大端 小端 QT 转换
  5人阅读  评论(0)  收藏  编辑  删除
分类:
 

什么是大端和小端  

大端小端是字节在内存中的存储的顺序。

(自己理解、方便记忆)从低地址开始到高地址,如果先存高位字节,那么就是大端模式,如果是先存位字节,就是小端模式。当然是针对至少占用两个字节的数据来说,如果是只占用一个字节,就没有大端小端问题了。

另外网络字节顺序是大端模式。

大端小端各自优势

小端模式 :强制转换数据不需要调整字节内容,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可以判断是否是大端模式
  1. BOOL IsBigEndian()  //类型强制转换方法
  2. {  
  3.     
    if (QSysInfo::ByteOrder != QSysInfo::BigEndian)
         {
    return false;
    }
    else
    return true;
  4. }

c/c++中判断大端小端的方法
  1. BOOL IsBigEndian()  //类型强制转换方法
  2. {  
  3.     int a = 0x1234;  
  4.     char b =  *(char *)&a;  
  5. //通过将int强制类型转换成char单字节,通过判断起始存储位置。即等于 取b等于a的低地址部分  
  6.     if( b == 0x12)  
  7.     {  
  8.         return TRUE;  
  9.     }  
  10.     return FALSE;  
  11. }

  1. BOOL IsBigEndian()  // union 结构体方法
  2. {  
  3.     union NUM  
  4.     {  
  5.         int a;  
  6.         char b;  
  7.     }num;  
  8.     num.a = 0x1234;  
  9.     if( num.b == 0x12 )  
  10.     {  
  11.         return TRUE;  
  12.     }  
  13.     return FALSE;  
  14. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值