关于htons(),htonl(),ntohl(),ntohs()函数的备忘

    htonl 表示 host to network long ,用于将主机 unsigned int 型数据转换成网络字节顺序;
   htons 表示 host to network short ,用于将主机 unsigned short 型数据转换成网络字节顺序;
   ntohl、ntohs 的功能分别与 htonl、htons 相反
   
   在 Windows 和 Linux 网络编程时需要用到的,用来将主机字节顺序转化为网络字节顺序。
  
这个函数只是为了消除字节存储顺序差异可能带来的错误,个人电脑上的字节存储顺序是因 CPU (中央处理器)不同而异的。
不同的CPU有不同的字节顺序类型,这些字节顺序类型指的是整数在内存中保存的顺序,即主机字节顺序。常见的有两种:
序号
英文名
中文名
描述
1
big-endian
大尾顺序
高字节数据存放在低地址处,低字节数据放在高地址处
2
little-endian
小尾顺序
低字节数据存放在低地址处,高字节数据放在高地址处

    在网络上传输数据时,由于数据传输的两端可能对应不同的硬件平台,采用的存储字节顺序也可能不一致,因此 TCP/IP 协议规定了在网络上必须采用 网络字节顺序(也就是大端模式)

    通过对大小端的存储原理分析可发现,对于 char 型数据,由于其只占一个字节,所以不存在这个问题,这也是一般情况下把数据缓冲区定义成 char 类型 的原因之一。对于 IP 地址、端口号等非 char 型数据,必须在数据发送到网络上之前将其转换成大端模式,在接收到数据之后再将其转换成符合接收端主机的存储模式。
 
 
Linux 系统为大小端模式的转换提供了 4 个函数,在终端输入 man byteorder 命令可得函数原型:
图片 



以htons()函数为例子,C语言表示:
图片  

执行结果:
图片 

说明:本机CPU为INTEL X86-64 CPU,内存以小端顺序存储16进制数据

内存存储的(十进制16,二进制0010)为 10 00,转换之后变成 00 10,即(十进制4096,二进制的1000)
【P.S.:(= =别忘了计算机是从后面往前读内存的哦】
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值