主机字节序,网络字节序,大小端问题笔记。

理解:
我们知道大小端是指数据在内存中不同的存放方式,不同的处理器数据存放的方式不同。实现跨平台通信则不能忽视大小端问题,类如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位以上的数舍去,造成数据值偏差。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值