欢迎来到天天文库
浏览记录
ID:28499213
大小:223.00 KB
页数:16页
时间:2018-12-10
《不同架构的字节顺序释疑.doc》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、交换字节在计算领域存在两种不同的字节顺序处理方法(或者说是endian格式)。endian格式指定了如何在内存中存储多字节数值中的各个字节;Big-endian的字节顺序处理方式表示存储多字节数据的时候权重最大的字节放在前面。Little-endian的字节顺序处理方式则表示存储多字节数据的时候权重最小的字节放在前面。PowerPC处理器使用big-endian的字节顺序处理方式,x86处理器家族则使用little-endian的字节顺序处理方式。根据约定,多字节的数据在网络上发送的时候,使用big-endian的字节处理方式。如果
2、您的应用程序假定数据是某种endian格式,而实际上数据使用的是另一种格式,则程序就会不正确地解析数据。您需要对代码中负责从磁盘或者网络读取多字节的数据(16位,32位,或者64位),或者将多字节数据写入到磁盘或网络的例程进行分析,因为这些例程对于字节顺序格式相当敏感。有两个常见的处理字节顺序差别的方法:在必要的时候进行字节交换,或者使用XML或其它与字节顺序无关的数据格式,比如CoreFoundation框架中的格式(CFPreferences,CFPropertyList,CFXMLParser)。采用字节交换的方法,还是使用与
3、字节顺序无关的数据格式存储数据,取决于您在应用程序中如何使用数据。如果您需要支持某个现有的文件格式,则二进制兼容的解决方案是首先接受应用程序中已经在使用的big-endian文件格式,然后书写字节交换代码,在x86系统上读写文件时使用。如果不需要支持老的文件,则可以考虑重新设计文件格式,以使用XML(extendedmarkuplanguage,即扩展的标志语言),XDR(externaldatarepresentation,即外部数据表示),或者NSCoding(ObjectiveC)来表示数据。本章接下来的部分将描述为什么字节顺
4、序会带来问题,给出交换字节的指导原则,描述MacOSX中提供的字节交换API,并且对大多数与字节顺序有关的情况提供解决方案。本部分包括如下主要内容:为什么字节顺序会带来问题交换字节的指导原则字节交换例程字节交换策略为字节交换数据书写和安装一个回调函数相关信息为什么字节顺序会带来问题这个部分的例子的设计目的是更为详尽地向您展示字节顺序为什么会带来问题。请看一下列表3-1中定义的C语言的数据结构。它包含一个四个字节的整形数,一个字符串,以及一个双字节的整形数。列表中的代码还初始化了这个结构。列表3-1: 包含多字节和单字节的数据结构t
5、ypedefstruct{uint32_tmyOptions;charmyStringArray[7];shortmyVariable;}myDataStructure; myDataStructureaStruct; aStruct.myOptions=0xfeedface;strcpy(aStruct.myStringArray,"safari");aStruct.myVariable=0x1234;请对比一下(参见图3-1)在big-endian和little-endian系统上是如何将这个结构存储在内存中的。在big-end
6、ian系统中,每个数据字节在内存中的地址是随着各个字节的权重从大到小递增;而在little-endian系统中,每个数据字节在内存中的地址是随着各个字节的权重从小到大递增。图3-1: Big-endian系统和little-endian系统的的字节组织顺序对比在您查看图3-1时,请注意下面几点:§多字节数据,比如图中显示的32位和6位长的变量,在big-endian和little-endian系统中存储方式是不一样的。在图中您可以看到,big-endian系统在存储数据时将权重最大的字节存放在最低的内存地址上,Little-end
7、ian系统在存储数据时则将权重最大的字节存放在最高的内存地址上。因此,在big-endian系统上,myOptions变量(0xce)权重最小的字节被存放在地址为0x00000003的内存单元上,而在little-endian系统上则存放在地址为0x00000000的内存单元上。§单字节数据,比如myStringArray字符数组中的char值,在两种系统中都存在同一个内存位置上,无论其字节顺序格式是什么。§每个系统都进行字节填充,以保持4字节数据是对齐的。在图中,填充字节用包含星号(*)的带阴影的方框来表示。如果您希望在使用某个架
8、构的系统上读取数据,而该数据是在使用不同架构的系统中写入的,并且您需要按字节访问数据,则多字节数据在内存中的字节顺序就会带来影响。举例来说,如果您的应用程序需要访问myOptions变量的第二个字节,则当您从采用反向字节顺序的系统中读
此文档下载收益归作者所有