不多有人关心字节顺序(Byte Ordering),由于它真的不多用到。何为字节顺序呢?让咱们先来看一个例子,假设如今有一个WORD类型的变量,它的值为0x7788,那么它在内存中是怎么存放的呢?
内存中:编程
低地址 高地址网络
0x77函数 |
0x88网络传输协议 |
高地址 低地址spa
0x77操作系统 |
0x88内存 |
事实上,对于不一样的CPU、不一样的操做系统,上图中的两种字节顺序都是可能的。若是像图上半部分那样:高字节在前,低字节在后,则这种字节顺序称做为big-endian;若是像图下半部分那样:低字节在前,高字节在后,则这种字节顺序称做为 little-endian。资源
常见的CPU、操做系统上使用的字节顺序
CPU 操做系统 字节顺序
x86 (Intel、AMD等) 全部 little-endian
DEC Alpha 全部 little-endian
HP-PA NT little-endian
HP-PA UNIX big-endian
SUN SPARC 全部 big-endian
MIPS NT little-endian
MIPS UNIX big-endian
PowerPC NT little-endian
PowerPC 非NT big-endian
RS/6000 UNIX big-endian
Motorola m68k 全部 big-endian
通常来讲,咱们不用关心字节顺序问题,除非要涉及到跨平台的通讯和资源共享,好比本章将要介绍的网络编程(网络传输协议TCP/IP采用的是big- endian)。假设如今要在使用不一样字节顺序的机器之间传输和交换数据,那该怎么办呢?(一样的数据,不一样的机器可能有不一样的理解,岂不是有悖初衷!)有两种方法,一种是所有转换成文原本传输,另外一种是双方都按照某一方的字节顺序来传输(这时就有一个不一样字节顺序之间的相互转换问题)。网络编程
Socket编程中常常采用第二种方法。整个传输过程以下:发送端将本机的数据转换成网络的字节顺序(调用API函数htonl或htons),而后发送;接收端收到网络数据后,先将数据转换成本机的字节顺序(调用API函数ntohl或ntohs),而后再进行其它操做——如此就能保证“会议精神”在通讯双方的正确传达了!it
这个过程当中用到的几个API函数:ntohl、htonl、ntohs、htons,名字都差很少,很难区分。可是若是知道了它们的来历,问题也就不存在了:n是network,网络的意思;h是host,本地主机的意思。ntohl,就是将32位的u_long类型的数据从网络字节顺序转换成本机字节顺序(htonl的字节顺序转换过程与ntohl相反);ntohs,就是将16位的u_short类型的数据从网络字节顺序转换成本机字节顺序(htons的字节顺序转换过程与ntohs相反)。 最后还有一个小问题:如何知道本机的字节顺序呢?有个很简单的方法,以下: BOOL IsLittleEndian(void) { WORD wValue = 0x5678; return (*((BYTE*)&wValue) == 0x78); }