字节顺序

计算机内存是如何存储一个多于一个字节的类型的数据呢,假如有1234H这个数一般有如下两种方式1 0x12 0x34     2.0x34 0x12

这种多字节数据类型的存储顺序即称为字节顺序。第一种是高字节在前,这种存储顺序称为大端(big-endian),第二种是低字节在前,这种存储顺序称为小端(little-endian)。Intelx86系列CPU采用低字节顺序,而有些CPU 如:SUN SPARC以及网络传输协议TCP/IP采用的高字节顺序。我们大部分都在用Intelx86系列的微机,如果要进行网络编程,就要在不同的字节顺序间传输数据,这样就会收到错误的数据。(如何解决这个问题呢?)有两种方法:一种是全部转换成文本来传输;另一种就是要在不同的字节顺序之间进行转换。

Socket编程中经常采用第二个方法。Winsock编程中整个的传输过程如下:接受到网络的数据后先转换成本机顺序(调用API函数ntohsntohl),然后继其他操作;发送数据时先把本机字节顺序的数据转换成网络字节顺序(调用API函数htonshtonl),然后发送。这样就可以确保数据正确的传输了。

这四个APIn代表network(网络),h代表host(本地主机的意思),s代表16u_short类型,l代表32u_long类型。知道了这几个字母的意思,理解这四个函数的作用就不难了。

但是,如何知道本机所采用的字节顺序呢,可以将一个多字节的数据转换成单字节类型(byte),这样就会只得到存储在最前面的那个字节。查看这个字节里的值就可以知道本机所采用的字节顺序了。或者可以采用如下代码:

#include

 

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;

}

 

注:这段代码来源于某位网友,感谢这位不知名的网友。

 

你可能感兴趣的:(网络编程,存储,网络,编程,api,network,socket)