主机字节序,网络字节序,大小端问题笔记。
我们知道大小端是指数据在内存中不同的存放方式,不同的处理器数据存放的方式不同。实现跨平台通信则不能忽视大小端问题,类如IBM、PowerPC是大端模式, 而我们常用的 x86 CPU (intel, AMD) 电脑是 little-endian,也就是整数的低位 字节 放在内存的低字节处。举个例子吧。假定你的数据是0x1234,
在网络字节顺序里 这个数据放到内存中就应该显示成
addr addr+1
0x12 0x34
而在x86电脑上,数据0x1234放到内存中实际是:
addr addr+1
0x34 0x12
注意:
我们说的需要转字节序是指需要网络传输数字的情况,如果是二进制流则不需要考虑。所谓的二进制流,就是逐个字节定义的数据。当你传输一个 int 值的时候,高位和低位的排列顺序会根据 cpu 的类型有所不同,但如果你定义一个数组 char Array[4],挨个字节填入 char 型值,然后发出去,它的顺序永远不会变,Array[0]永远在Array[1]前面。
实际用处:
在socket编程中TCP/IP 协议要求IP、Port需要转网络字节序。
servaddr.sin_port = htons(port);
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
罗列下常用函数:
#include <arpa/inet.h>
uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);
htonl 表示 host to network long ,用于将主机 unsigned int 型数据转换成网络字节顺序;
htons 表示 host to network short ,用于将主机 unsigned short 型数据转换成网络字节顺序;
ntohl、ntohs 的功能分别与 htonl、htons 相反。
补充下,ntons/ntonl何时用
根据要转换的值是否超过16位来决定,16位内一般用htons,当然用htonl也可以;
但是如果要转换的数 转换成2进制超过16位,则只能用htonl,此时如果用htons,16位以上的数舍去,造成数据值偏差。
————————————————
版权声明:本文为CSDN博主「qq_40129743」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_40129743/article/details/78749062