在Linux网络编程中,经常会遇见网络字节序喝主机字节序的相互转换,要了解他们,首先要知道什么是字节序。
字节序,顾名思义,指字节在内存中存储的顺序。比如一个int32_t类型的数值占用4个字节,这4个字节在内存中的排列顺序就是字节序。字节序分为两种:Big-Endian和Little-Endian。引用标准的Big-Endian和Little-Endian的定义如下:
(1)小端字节序(Little endinan),数值低位存储在内存的低地址,高位存储在内存的高地址;
(2)大端字节序(Big endian),数值高位存储在内存的低地址,低位存储在内存的高地址。
计算机电路先处理低位字节,效率比较高,因为计算都是从低位开始的,所以计算机的内部处理大都是小端字节序。但是,人类还是习惯大端字节序。所以,除了计算机的内部处理,其他场合几乎都是大端字节序,比如网络传输和文件储存等。所以就出现了大端字节序和小端字节序。
网络字节序,它是确定的。 网络字节顺序 是TCP/IP中规定好的一种数据表示格式,它与具体的 CPU 类型、 操作系统 等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。
主机字节序指的是处理器存储数据的字节顺序。 对于Inter x86处理器来说,将数据的不重要的部分保存在低地址,重要的部分保存在高地址,即低地址中保存的是数据的低字节位,高地址保存的是数据的高字节位。
主机字节序和网络字节序为什么需要转换呢?这是因为由于网络字节的顺序和主机的字节顺序可能存在不同,需要进行转换以统一“格式”。其中网络字节序与主机字节序之间的转换函数:htons(), ntohs(), htons(),htonl(),位于头文件<netinet/in.h>,htons和ntohs完成16位无符号数的相互转换,htonl和ntohl完成32位无符号数的相互转换。
网络中传输的数据有的和本地字节存储顺序一致,而有的则截然不同,为了数据的一致性,就要把本地的数据转换成网络上使用的格式,然后发送出去,接收的时候也是一样的,经过转换然后才去使用这些数据,基本的库函数中提供了这样的可以进行字节转换的函数,如和htons( ) htonl( ) ntohs( ) ntohl( ),这里n表示network,h表示host,htons( ) htonl( )用于本地字节向网络字节转换的场合,s表示short,即对2字节操作,l表示long即对4字节操作。同样ntohs( )ntohl( )用于网络字节向本地格式转换的场合
1、htons 把unsigned short类型从主机序转换到网络序
2、htonl 把unsigned long类型从主机序转换到网络序
3、ntohs 把unsigned short类型从网络序转换到主机序
4、ntohl 把unsigned long类型从网络序转换到主机序
在使用little endian的系统中 这些函数会把字节序进行转换,在使用big endian类型的系统中这些函数会定义成空宏。
其他类型字节序转换,比如long long 类型的网络字节顺序转换可以通过位移的方式实现。如果现在要对64位类型数据进行主机字节序和网络字节序的转换,没有现成系统API可用的话,可用移位或者使用联合体union进行转换。
标签:转换,字节,主机,网络,地址,htons,函数 From: https://www.cnblogs.com/Aprillamb/p/16771702.html