htons和htonl函数具体应用

htons和htonl函数,是用来将主机字节顺序转换为网络字节顺序

在进行网络抓包时,抓到的包的数据是网络字节顺序,在进行编程时,要进行主机字节顺序和网络字节顺序间的转换。
例如:
(对一软件进行抓包时,写的一段小程序)
ipp2p:

if(get_u16(payload,0)==__constant_htons(0x0600) 
         && get_u32(payload,2)==(plen-6))
   {
     printk("identifing and datalen=%d /n",plen);
     return(IPP2P_TEST*100+6);
   }

网络字节是0x0600,而在主机内部所读的字节是0x06.

简单而言,htons()是将一个数的高低位进行互换:(如:06 00 --> 00 06)

注明:

get_u32(payload,0)==_htonl(0x06073200)

则主机内部字节为:0x320706

htonl 是针对32位,4个字节而言
htons 是针对16位,2个字节而言

另外需注意,数字所占位数小于或等于一个字节(8 bits)时,不要需转换。

htonl(), ntohl(), htons(), ntohs() 函数

在C/C++写网络程序的时候,往往会遇到字节的网络顺序和主机顺序的问题。这是就可能用到htons(), ntohl(), ntohs(),htons()这4个函数。
网络字节顺序与本地字节顺序之间的转换函数:

htonl()--"Host to Network Long"
ntohl()--"Network to Host Long"
htons()--"Host to Network Short"
ntohs()--"Network to Host Short"

之所以需要这些函数是因为计算机数据表示存在两种字节顺序:网络字节顺序NBO(Network Byte Order)与主机字节顺序HBO(Host Byte Order)

a) Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
b) Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。
c) 网络字节序:TCP/IP各层协议将字节序定义为Big-Endian,因此TCP/IP协议中使用的字节序通常称之为网络字节序。

网络字节顺序NBO: 按从高到低的顺序存储,在网络上使用统一的网络字节顺序,可以避免兼容性问题。

主机字节顺序HBO: 不同的机器HBO不相同,与CPU设计有关,数据的顺序是由cpu决定的,而与操作系统无关。(大端和小端模式与cpu设计有关而和操作系统无关)
如 Intel x86结构下, short型数0x1234表示为34 12, int型数0x12345678表示为78 56 34 12  
如 IBM power PC结构下, short型数0x1234表示为12 34, int型数0x12345678表示为12 34 56 78
   
由于这个原因不同体系结构的机器之间无法通信,所以要转换成一种约定的数序,也就是网络字节顺序,其实就是如同power pc那样的顺序. 在PC开发中有ntohl和htonl函数可以用来进行网络字节和主机字节的转换.

htonl(), ntohl(), htons(), ntohs() 函数具体应用相关推荐

  1. htonl(), ntohl(), htons(), ntohs() 函数

    转自:http://www.cnblogs.com/s7vens/archive/2011/12/12/2284892.html 在C/C++写网络程序的时候,往往会遇到字节的网络顺序和主机顺序的问题 ...

  2. htonl ntohl htons ntohs

    在C/C++写网络程序的时候,往往会遇到字节的网络顺序和主机顺序的问题. 这时就可能用到htons(), ntohl(), ntohs(),htons()这4个网络字节顺序与本地字节顺序之间的转换函数 ...

  3. 【PackUnPack】htonl、htons、ntohl、ntohs函数实现

    网络字节序是大端 参考: htonl.htons.ntohl.ntohs函数实现 判断是大端还是小端 小端时,(ENDIANNESS=='l') static union { char c[4]; u ...

  4. 模拟htonl、ntohl、htons、ntohs函数实现

    模拟htonl.ntohl.htons.ntohs函数实现 2010-04-14 17:25:06|  分类: 网络编程 |  标签: |字号大中小 订阅 From: http://wxxweb.bl ...

  5. Linux网络通信----htonl()、htons()、ntohl()、ntohs()四个函数

    转载:https://blog.csdn.net/miao19920101/article/details/69398158 前言: 今天在工作中用到htonl()这个函数,不是很理解,查阅资料之后随 ...

  6. htonl、ntohl、htons、ntohs函数实现

    转载:https://blog.csdn.net/lizhi200404520/article/details/7290193 因为,有符号数右移会发送补符号位1的情况,所以,以下会对原数强制类型转换 ...

  7. htons、htonl、ntohl、ntohs的区别与使用

    文章目录 1.网络编程字节转换 2. 主机字节顺序<-->网络字节顺序 3.大小端模式 1.网络编程字节转换 s表示短.l表示长: ntohs =net to host short int ...

  8. 网络字节顺序和主机字节顺序的转换(htons ntohs htonl ntohl)

    from  https://blog.csdn.net/baidu_33621692/article/details/53213002 网络字节顺序和主机字节顺序的转换(htons ntohs hto ...

  9. ntohs, ntohl, htons,htonl

    ntohs, ntohl, htons,htonl的比较和详解 在C/C++写网络程序的时候,往往会遇到字节的网络顺序和主机顺序的问题. 这时就可能用到htons(), ntohl(), ntohs( ...

最新文章

  1. 跟我学Spring Cloud(Finchley版)-16-Zuul
  2. linux下卸载mysql(rpm)
  3. c语言中Gretchen函数的功能,听过很多的歌的音乐达人给我推荐一下
  4. Opencv--线性及双线性插值算法
  5. 命令行开启一个unity实例和执行其中的脚本方法的使用和注意
  6. 2012r2配置java_JDK+Tomcat 服务器配置+腾讯云Win2012 R2 配置安装
  7. socket是什么?
  8. js中WINDOW对象中的navigator成员对象
  9. image.open()得到的图片是什么类型_复古门窗花格图片大全让精彩生活继续闪耀 「巴森」...
  10. 移动开发的设计稿为什么大多数是750px?
  11. 推荐6本Java书籍,助你在Java路上更精进!
  12. Spotfire 使用IronPython脚本
  13. 【python中级】 ico图标生成器
  14. java研发微博营销
  15. 网站不收录怎么办?网站SEO优化工具
  16. 坚果云企业版服务器端,坚果云团队版和企业版的区别
  17. 生成CA根证书、公钥、私钥指令(数字证书)
  18. ZOJ 3736 模拟魔方
  19. 安全尽职是企业的阿克琉斯之踵
  20. 邮件服务器 POP3协议 详解

热门文章

  1. 目标检测中的Anchor
  2. 根据 commit message 自动生成 changelog
  3. Ridge Regression and Kernel Ridge Regression
  4. 贝叶斯方法与Ridge回归的联系
  5. MATLAB对三阶魔方建模并进行旋转操作
  6. 开源IoT操作系统Mynewt使用简介
  7. git中patch的用法
  8. 论文查重软件查重时需要注意的问题有哪些?
  9. Spring-aop面向切面
  10. VS下报LNK1104的一种解决方法