项目开发中问题总结:网络字节序
2010-03-09 17:26
197 查看
在用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一样 。
主要用到的是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一样 。
相关文章推荐
- 项目开发遇到的问题及其解决.总结
- 开发项目遇到的大大小小问题总结
- 对第一次项目总结--ssh开发中遇到的小问题总结
- MyEclipse开发JavaEE项目遇到问题的总结
- 项目开发中经常遇到的一些问题总结
- 使用Vue框架开发商城mall项目中所遇到的问题及技术点总结
- Eclipse rap 富客户端开发总结(2)- rap项目目前的进度和存在的问题
- 最近的android项目开发问题总结
- 某教育平台项目开发之--使用SSM框架开发过程遇到的问题总结
- 总结最近项目开发中遇到的问题,希望对大家有所帮助!
- 没头没尾--项目开发笔记:项目问题的阶段性总结,下一步…………
- 最近的android项目开发问题总结
- PDA(WinCE)项目开发中遇到的问题及解决方法总结
- Android项目《Tom伴你行》开发过程中遇到的问题总结
- Java基础学习总结(61)——Java项目开发要注意的60个问题
- 开发第一个java项目的问题总结
- OA项目开发遇到的问题总结
- 项目开发、项目管理中遇到的问题总结
- moss开发实施过程中遇到的问题总结:项目层面
- iOS开发——项目实战总结&UITableView性能优化与卡顿问题