在Socket接口编程中,大小端字节序转换的函数

预备概念:

Big-Endian和Little-Endian 

定义如下:

1) Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
2) Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。
举一个例子,比如数字0x12 34 56 78在内存中的表示形式为:

1)大端模式:

  低地址 -----------------> 高地址
  0x12  |  0x34  |  0x56  |  0x78

2)小端模式:

  低地址 ------------------> 高地址
  0x78  |  0x56  |  0x34  |  0x12

顺带讲一下大小端各自的优势:

  小端模式 :强制转换数据不需要调整字节内容,1、2、4字节的存储方式一样。
  大端模式 :符号位的判定固定为第一个字节,容易判断正负。

  这里解释下:当较低类型的数据转换为较高类型时,一般只是形式上有所改变, 而不影响数据的实质内容, 而较高类型的数据转换为较低类型时则可能有些数据丢失。当我们把一个int型强制转化为byte时,由于byte只有1个字节,而int型是4个字节,这样就会产生截断,int把它最低的内存空间里的值放到了byte所对应的内存空间里。内存地址是由上到下有从左至右依次递增的,小端字节序指低字节位数据存放在内存低地址处, 高字节位数据存放在内存高地址处; 大端字节序是高字节数据存放在低地址处,低字节数据存放在高地址处。x86的CPU体系结构中,就是使用小端字节序,即低字节数据存放在低地址处,高字节数据存放在高地址处。将int型的数据转化成char型的数据时,我们只取低8位;如果我们的CPU是小端模式,则我们在进行强制类型转换时不需要调整字节内容,非常的方便;如果我们的CPU是大端模式,则我们,需要将高字节地址的数据存入低字节地址,也就是需要调整字节内容。

从软件的角度上,不同端模式的处理器进行数据传递时必须要考虑端模式的不同。如进行网络数据传递时,必须要考虑端模式的转换。在Socket接口编程中,以下几个函数用于大小端字节序的转换。

1 #define ntohs(n)     //16位数据类型网络字节顺序到主机字节顺序的转换  
2 #define htons(n)     //16位数据类型主机字节顺序到网络字节顺序的转换  
3 #define ntohl(n)      //32位数据类型网络字节顺序到主机字节顺序的转换  
4 #define htonl(n)      //32位数据类型主机字节顺序到网络字节顺序的转换 

其中互联网使用的网络字节顺序采用大端模式进行编址,而主机字节顺序根据处理器的不同而不同,如PowerPC处理器使用大端模式,而Pentuim处理器使用小端模式。

更多详细请参考:http://blog.csdn.net/ce123_zhouwei/article/details/6971544

  1. #define ntohs(n)     //16位数据类型网络字节顺序到主机字节顺序的转换  
  2. #define htons(n)     //16位数据类型主机字节顺序到网络字节顺序的转换  
  3. #define ntohl(n)      //32位数据类型网络字节顺序到主机字节顺序的转换  
  4. #define htonl(n)      //32位数据类型主机字节顺序到网络字节顺序的转换 
posted @ 2017-06-28 15:15  Tsunami_lj  阅读(539)  评论(0编辑  收藏  举报