计算机内存是如何存储一个多于一个字节的类型的数据呢,假如有1234H这个数一般有如下两种方式1 0x12 0x34 2.0x34 0x12
这种多字节数据类型的存储顺序即称为字节顺序。第一种是高字节在前,这种存储顺序称为大端(big-endian),第二种是低字节在前,这种存储顺序称为小端(little-endian)。Intel的x86系列CPU采用低字节顺序,而有些CPU 如:SUN SPARC以及网络传输协议TCP/IP采用的高字节顺序。我们大部分都在用Intel的x86系列的微机,如果要进行网络编程,就要在不同的字节顺序间传输数据,这样就会收到错误的数据。(如何解决这个问题呢?)有两种方法:一种是全部转换成文本来传输;另一种就是要在不同的字节顺序之间进行转换。
Socket编程中经常采用第二个方法。Winsock编程中整个的传输过程如下:接受到网络的数据后先转换成本机顺序(调用API函数ntohs和ntohl),然后继其他操作;发送数据时先把本机字节顺序的数据转换成网络字节顺序(调用API函数htons和htonl),然后发送。这样就可以确保数据正确的传输了。
这四个API中n代表network(网络),h代表host(本地主机的意思),s代表16位u_short类型,l代表32为u_long类型。知道了这几个字母的意思,理解这四个函数的作用就不难了。
但是,如何知道本机所采用的字节顺序呢,可以将一个多字节的数据转换成单字节类型(byte),这样就会只得到存储在最前面的那个字节。查看这个字节里的值就可以知道本机所采用的字节顺序了。或者可以采用如下代码:
#include <iostream>
using namespace std;
int CheckEndian()
{
union
{
int iFourBytes;
char cOneByte;
} uEndianChecker;
uEndianChecker.iFourBytes = 1 ;
return uEndianChecker.cOneByte;
}
int main()
{
if(CheckEndian()==1)
cout<<"little-endian";
return 0;
}
注:这段代码来源于某位网友,感谢这位不知名的网友。