实例:

在研究这两个函数时,总是遇到htonl和ntohl输出的值是一样的情况,明明一个是主机序转网络序,一个是网络序转主机序,为什么值会输出一样呢?请看代码:

 uint32_t ulTemp = 1234;  //16进制为00 00 04D2(大端序)  ,
实质我的机器(小端机)储存为:D2 04 00 00四字节ulTemp = htonl(ulTemp); //机器为主机序,使用htonl转为大端序后,
ulTemp内存为: 00 00 04 D2uint8_t mysz[4] = {0xff};memcpy((void *)mysz, (void *)&ulTemp, 4);printf("%02x%02x%02x%02x\n",mysz[0],mysz[1],mysz[2],mysz[3]);
//结果为:00 00 04D2 ,这里看起来没问题,是正常的。

好,上面看起来符合正常逻辑,没问题。

接下来看下面使用ntohl来看看情况,个人认为这是比较诡异的部分:


uint32_t ulTemp = 1234;  //16进制为00 00 04D2(大端序)  ,
实质我的机器(小端机)储存为:D2 04 00 00四字节ulTemp = ntohl(ulTemp); //使用该函数后,
ulTemp在机器内存中存储实质变为:00 00 04 D2 ??
问题:为什么我调用了ntohl转为小端序了,ulTemp 怎么内存结构是大端序的样子呢?uint8_t mysz[4] = {0xff};memcpy((void *)mysz, (void *)&ulTemp, 4);printf("%02x%02x%02x%02x\n",mysz[0],mysz[1],mysz[2],mysz[3]);//结果:00 00 04 D2

看完上面代码你会发现,使用ntohl并没有转为你想要的小端序结果(D2 04 00 00 ),依然还是大端结果00 00 04 D2,和前面的例子输出一样,为什么呢?

个人认为:在调用ntohl时,其实是先将ulTemp转为大端序(00 00 04 D2),然后再看机器的字节序是大端还是小端,如果是小端的话,就不再转了(00 00 04 D2)。如果是大端,就还需要再转一次(D2 04 00 00)。

在调用htonl时,先将ulTemp转为小端序(D2 04 00 00),然后再看机器字节序是大端还是小端,如果是小端的话,就还需要再转为大端(00 00 04 D2)。如果是大端,就不需要再转了

个人结论,不一定准确:判断ntohl和htonl的值时,我们先判断第一个字母,如果是n,说明该变量要转为大端序,再看机器的字节序是否为小端序,是的话就不转序,不是就再转一道序。如果第一个字母是h,先将该变量转为小端序,再看机器字节序是否为大端序,是的话就不转序,不是就再转一次序。这样,无论是使用htonl还是使用ntohl,其最终在内存中都是一样的,这样就解释的通了。

记录一次htonl和ntohl的使用方法和差别相关推荐

  1. 【VS开发】IP地址格式转换(htonl、ntohl;inet_addr、inet_ntoa)

    1.htonl ()和ntohl( ) u_long PASCAL FAR ntohl (u_long netlong); u_short PASCAL FAR ntohs (u_short nets ...

  2. 【网络】IP地址格式转换(htonl、ntohl;inet_addr、inet_ntoa)

    1.htonl ()和ntohl( ) u_long PASCAL FAR ntohl (u_long netlong); u_short PASCAL FAR ntohs (u_short nets ...

  3. Socket中常见的几个转换函数(htonl,htons,ntohl,ntohs,inet_addr,inet_ntoa)

    Socket中常见的几个转换函数(htonl,htons,ntohl,ntohs,inet_addr,inet_ntoa) htonl() htons() ntohl() ntohs()及inet_n ...

  4. htonl,htons,ntohl,ntohs的详解

    大小端模式 对于多字节的数值在系统中如何存储取决于各CPU的实现,而高字节部分是存在低地址还是高地址就有不一样的结果了,因此才有大小端两种模式的存在,而命名则是根据起始地址存放的是数值字节的低处还是高 ...

  5. htons(), htonl(), ntohs(), ntohl()

    在网络编程中,往往会遇到字节的网络顺序和主机顺序的问题. 我们先来了解下字节的网络顺序和主机顺序: 网络字节序与主机字节序 主机字节序:就是我们平常说的大端和小端模式,不同的CPU有不同的字节序类型, ...

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

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

  7. 主机字节序与网络字节序的转换函数:htonl、ntohl、htons、ntohs

    Part 1: htons函数具体解释      在Linux和Windows网络编程时需要用到htons和htonl函数,用来将主机字节顺序转换为网络字节顺序. 在Intel机器下,执行以下程序 i ...

  8. htonl函数 c语言,c – 理解htonl()和ntohl()

    我试图使用unix套接字测试发送一些udp数据包到localhost. 我的理解是,当设置ip地址和端口以便发送数据包时,我会将我的sockaddr_inwith填充为转换为网络字节顺序的值. 我在O ...

  9. 通俗易懂说字节序,大小端,网络序和主机序(2)htonl和ntohl 源码实现

    通俗易懂说字节序,大小端,网络序和主机序(2)htonl和ntohl 源码实现 1. htonl 内核源码实现 1.1 注意:这里有判断,如果本身内存中存储的就是网络序,那就不转 1.1 __bswa ...

最新文章

  1. macOS10.12部署sonarqube5.6.3
  2. toj 3711 水题
  3. 对GC垃圾收集的一点整理
  4. 面试:Spring Boot 中的条件注解底层是如何实现的?
  5. Packet for query is too large (1166 1024). You can change this value
  6. Python 数据增强 -- PIL模块
  7. mysql jpa 批注 视图_通过JPA注解映射视图的实体类 jpa 视图 无主键 @Query注解的用法(Spring Data JPA) jpa 使用sql语句...
  8. 树莓派静态IP配置方法
  9. python标准库sys_Python标准库之Sys模块使用详解
  10. 012.对netmap API的解读
  11. react 图片放在src里面还是public_手写Webpack从0编译Vue/React项目
  12. 1038. 统计同成绩学生(20)-PAT乙级真题
  13. Brew Command Not Found
  14. 如何使用清理垃圾软件优化苹果电脑
  15. 牛牛游戏牛型判断算法实现
  16. 大厂团队Leader实战秘诀:工程师成长最重要的8项技能
  17. 00 SQL课程简介
  18. c语言数据文件是,C语言数据文件操作.ppt
  19. MySQL基础(附练习题+答案)
  20. 51单片机的1T和12T的区别

热门文章

  1. 基于高分辨率影像的潍坊大棚遥感提取
  2. 让电驴(Emule)获取更高下载速度的方法 !(电驴下载慢的朋友可以进来学习下)
  3. freopen重定向函数
  4. 移除Ubuntu上陈旧的PPA仓库
  5. (C语言)switch()
  6. android activity 窗口化后 隐藏
  7. springcloud 整合gateway 网关
  8. 【机器学习自学笔记4】朴素贝叶斯分类器
  9. 01.计算机知识常识整理
  10. linux安装软件很慢么,提高Fedora Linux应用程序安装速度的方法