记录一次htonl和ntohl的使用方法和差别
实例:
在研究这两个函数时,总是遇到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的使用方法和差别相关推荐
- 【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 ...
- 【网络】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 ...
- Socket中常见的几个转换函数(htonl,htons,ntohl,ntohs,inet_addr,inet_ntoa)
Socket中常见的几个转换函数(htonl,htons,ntohl,ntohs,inet_addr,inet_ntoa) htonl() htons() ntohl() ntohs()及inet_n ...
- htonl,htons,ntohl,ntohs的详解
大小端模式 对于多字节的数值在系统中如何存储取决于各CPU的实现,而高字节部分是存在低地址还是高地址就有不一样的结果了,因此才有大小端两种模式的存在,而命名则是根据起始地址存放的是数值字节的低处还是高 ...
- htons(), htonl(), ntohs(), ntohl()
在网络编程中,往往会遇到字节的网络顺序和主机顺序的问题. 我们先来了解下字节的网络顺序和主机顺序: 网络字节序与主机字节序 主机字节序:就是我们平常说的大端和小端模式,不同的CPU有不同的字节序类型, ...
- 模拟htonl、ntohl、htons、ntohs函数实现
模拟htonl.ntohl.htons.ntohs函数实现 2010-04-14 17:25:06| 分类: 网络编程 | 标签: |字号大中小 订阅 From: http://wxxweb.bl ...
- 主机字节序与网络字节序的转换函数:htonl、ntohl、htons、ntohs
Part 1: htons函数具体解释 在Linux和Windows网络编程时需要用到htons和htonl函数,用来将主机字节顺序转换为网络字节顺序. 在Intel机器下,执行以下程序 i ...
- htonl函数 c语言,c – 理解htonl()和ntohl()
我试图使用unix套接字测试发送一些udp数据包到localhost. 我的理解是,当设置ip地址和端口以便发送数据包时,我会将我的sockaddr_inwith填充为转换为网络字节顺序的值. 我在O ...
- 通俗易懂说字节序,大小端,网络序和主机序(2)htonl和ntohl 源码实现
通俗易懂说字节序,大小端,网络序和主机序(2)htonl和ntohl 源码实现 1. htonl 内核源码实现 1.1 注意:这里有判断,如果本身内存中存储的就是网络序,那就不转 1.1 __bswa ...
最新文章
- macOS10.12部署sonarqube5.6.3
- toj 3711 水题
- 对GC垃圾收集的一点整理
- 面试:Spring Boot 中的条件注解底层是如何实现的?
- Packet for query is too large (1166 1024). You can change this value
- Python 数据增强 -- PIL模块
- mysql jpa 批注 视图_通过JPA注解映射视图的实体类 jpa 视图 无主键 @Query注解的用法(Spring Data JPA) jpa 使用sql语句...
- 树莓派静态IP配置方法
- python标准库sys_Python标准库之Sys模块使用详解
- 012.对netmap API的解读
- react 图片放在src里面还是public_手写Webpack从0编译Vue/React项目
- 1038. 统计同成绩学生(20)-PAT乙级真题
- Brew Command Not Found
- 如何使用清理垃圾软件优化苹果电脑
- 牛牛游戏牛型判断算法实现
- 大厂团队Leader实战秘诀:工程师成长最重要的8项技能
- 00 SQL课程简介
- c语言数据文件是,C语言数据文件操作.ppt
- MySQL基础(附练习题+答案)
- 51单片机的1T和12T的区别