项目开发中问题总结:网络字节序

 

 

在用Socket进行文件下载的时候遇见的问题,首先连接Socket,然后提交一个字符串过去,这个字符串的组成有整数也有描述符,描述符直接写到Tbuf中即可,而对于整数则需要转换为网络字节序上传。

 

主要用到的是BigEndian这个类

 

对于网络字节序转换为整数:

TUint32 iStatusRes;

iStatusRes = BigEndian::Get32(iBufStatusRes.Ptr());

即可。

对于整数转换为网络字节序

TUint8* pkg_len = new TUint8[4];

CleanupStack::PushL(pkg_len);

TInt len = 222;

BigEndian::Put32(pkg_len, len);

 

bufLoginOut.Append(pkg_len, 4);  //TBuf8<40> bufLoginOut;

 

 

字节顺序是指多字节类型的数据在内存中的存放顺序, 通常有小端(Little Endian) 、大端(Big Endian) 两种字节顺序.
      内存地址是由上到下有从左至右依次递增的,小端字节序指低字节位数据存放在内存低地址处, 高字节位数据存放在内存高地址处; 大端字节序是高字节数据存放在低地址处,低字节数据存放在高地址处.
    举个例子, 比如数字0x1 2 3 4 5 6 7 8在两种不同字节序CPU中的存储顺序如下所示:
                                       | |              | |
                                       //               //
                                     最高位       最低位

Big Endian(高位存低址 低位存高址) 

低地址                              高地址
 |  ----------------------------------------->
 |  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |  |     12     |      34    |     56      |     78    |
 |  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 /
高地址


Little Endian (高位存高址 低位存低址) 

低地址                              高地址
 |  ----------------------------------------->
 |  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |  |     78     |      56    |     34      |     12    |
 |  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 /
高地址

    从上面两图可以看出, 采用Big Endian方式存储数据更符合我们人类的思维习惯. 所有网络协议也都是采用Big Endian的方式来传输数据的. 所以有时我们也会把Big Endian方式称之为网络字节序.

    谈到字节序的问题, 必然牵涉到两大CPU派系. 那就是Motorola的PowerPC系列CPU和Intel的x86系列CPU. PowerPC系列采用Big Endian方式存储数据, 而x86系列则采用Little Endian方式存储数据.   上面是摘自网络的一些介绍,字节序会对不同平台之间传递数据会有影响,虽然字节序只和CPU的构造有关,那么基于Symbian操作系统的ARM平台的字节序是怎样的呢?

 

写了一段测试代码  TInt number=0x12345678;
 TBuf<10> msg;
 for(TInt i=0;i<4;i++)
  {
  msg.AppendNumFixedWidthUC(((TUint8*)&number)[i],EHex,2);
  }
 RunNote1L(&msg);

 

  在模拟器和N95上测试结果为:78563412,说明字节序是小端的,和X86一样 。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值