使用Intel编译器解决字节序问题
1. 什么是字节序(Endianess)
Endian或者Endianess, 一般指的是在外部内存中存储的字节顺序。在IA平台上开发网络程序的程序员大多遇到过字节序问题。网络协议是按照大端字节序定义的, 我们通常称之为Big-endian, 简称大端。 IA架构的主机字节序是小端字节序, 我们称之为Little-endian, 简称小端。在主机上定义的数据比如IP地址在发送到网络端的时候, 通常需要做字节序的转换, 也就是小端到大端的转换, 比如使用HTON()来实现。
大端和小端在外部内存中存放的字节序是相反的。 对于大端来说, 在内存低地址存放的是数据高位字节,在内存高地址存放的是数据低位字节。 小端则相反, 在内存低地址存放的是数据低位字节, 在内存高位地址存放的是数据高位字节。
举例来说, 对于整数0x89ABCDEF在内存中的存放, 大端和小端区别如下图所示:
2. 大小端带来的程序移植问题
对于不同的主机架构, 支持的字节序也不一样。 对于英特尔的架构来说, 基本都是小端架构的。其他的比如sun SPARC, IBM PPC, 使用的是大端架构。如此一来, 针对某个架构开发的应用程序, 当我们要把它移植到其他不同字节序的架构上时, 就存在一个字节序的问题。 虽然同样是C/C++的代码, 同样一段程序, 在大端架构上执行得到的结果和小端架构上执行得到的结果可能是不一样的。