所谓的大端序与小端序,就是在数据表示的时候高位字节在前还是在后。采用大端序时,高位字节放在前面,即低地址中;而小端序的高位字节放在后面。比如对short int型变量4660,占据2个字节。其八进制为0x1234(00010010 00110100),采用大端序时,高位0x12放在前面,存放为0x12 0x34(左边为低地址);采用小端序时,低位字节0x34放在前面:0x34 0x12。 不同的机器可能采用不同的字节序,IP协议的网络字节序为大端序。在涉及到网络数据传输时,需要处理字节序的问题。比如IP包头中的目的地址和包长,必须要转换为网络字节序,否则不能正确传输。而要传输的数据也必须要进行转换,否则不同字节序的及其之间不能相互理解对方传来的数据。对于字节序的转换,可以自己编写程序实现,也可以采用系统提供的函数。LINUX系统提供如下的转换函数:
uint32_t htonl (unit32_t hostlong);
unit16_t htons (unit16_t hostshort);
unit32_t
unit16_t
函数名中h表示host,n表示network,l表示long,s表示short,至于to嘛,就是to了,呵呵。比如函数htonl的作用就是把本机的long int型数据转换为网络字节序。
#include<netinet/in.h>
#include<stdio.h>
#include<stdlib.h>
int main(){
uint16_t host_short = 80;
uint32_t host_long = 80;
printf("network_short = %x\n", htons(host_short));
printf("network_long = %lx\n", htonl(host_long));
return 0;
}
NBO与HBO
网络字节顺序NBO(Network Byte Order):按从高到低的顺序存储,在网络上使用统一的网络字节顺序,可以避免兼容性问题。
主机字节顺序(HBO,Host Byte Order):不同的机器HBO不相同,与CPU设计有关计算机数据存储有两种字节优先顺序:高位字节优先和低位字节优先。Internet上数据以高位字节优先顺序在网络上传输,所以对于在内部是以低位字节优先方式存储数据的机器,在Internet上传输数据时就需要进行转换。
所以为了统一,发送多数据时,比如 unit16_t unit32_t 等数据时 必须先进行hton转换 htonl(),htons(),接受数据时,比如 unit16_t unit32_t 等数据时 必须先进行ntoh转换 ntohl(),ntohs(),