转载:https://blog.csdn.net/miao19920101/article/details/69398158

前言:

今天在工作中用到htonl()这个函数,不是很理解,查阅资料之后随笔就记录下来,方便以后工作和学习翻阅。
首先需要说明的是这四个函数的头文件都需要头文件:

#include <arpa/inet.h> 
  • 1

htonl()函数

函数原型是:uint32_t htonl(uint32_t hostlong)
其中,hostlong是主机字节顺序表达的32位数,htonl中的h–host主机地址,to–to,n–net网络,l–unsigned long无符号的长整型(32位的系统是4字节);
函数返回值是一个32位的网络字节顺序
函数的作用是将一个32位数从主机字节顺序转换成网络字节顺序

htons()函数

函数原型是:uint16_t htons(uint16_t hostlong)
其中,hostlong是主机字节顺序表达的16位数,htons中的h–host主机地址,to–to,n–net网络,s–signed long无符号的短整型(32位的系统是2字节);
函数返回值是一个16位的网络字节顺序
函数的作用是将一个16位数从主机字节顺序转换成网络字节顺序简单的说就是把一个16位数高低位呼唤

ntohs()函数

函数原型是:uint16_t ntohs(uint16_t hostlong)
其中,hostlong是网络字节顺序表达的16位数,ntohs中的,n–net网络,to–toh–host主机地址,s–signed long有符号的短整型(32位的系统是2字节);
函数返回值是一个16位的主机字节顺序
函数的作用是将一个16位数由网络字节顺序转换为主机字节顺序简单的说就是把一个16位数高低位互换

ntohl()函数

函数原型是:uint32_t ntohs(uint32_t hostlong)
其中,hostlong是网络字节顺序表达的32位数,ntohs中的,n–net网络,to–toh–host主机地址,s–unsigned long无符号的短整型(32位的系统是4字节);
函数返回值是一个32位的主机字节顺序
函数的作用是将一个32位数由网络字节顺序转换为主机字节顺序

这些函数存在的意义

为什么存在这个函数呢?或者存在这个函数的意义?
说到这部分需要引入字节存放的两个概念一个是“大端顺序”,一个是“小端顺序”。俗称“小尾顺序”、“大尾顺序”。
简单的说就是对应数据的高字节存放在低地址,低字节存放在高地址上就是大端顺序,对应数据的高字节存放在高地址,低字节存放在低地址上就是小端顺序
比如 unsigned long hostlong = 0xa2b4c6d8;
大端顺序存放:
偏移地址 存放内容
0x00000000 0xa2
0x00000001 0xb4
0x00000002 0xc6
0x00000003 0xd8

小端顺序存放:
偏移地址 存放内容
0x00000000 0xd8
0x00000001 0xc6
0x00000002 0xb4
0x00000003 0xa2
同理推理16位数以及64位数。

一般地,在我的编译器里面设置的是小端顺序,这个可以根据自己的编译器看下设置,这里不深入说明。但是网络传输数据采用的是大端顺序。所以这才涉及到主机字节顺序和网络字节顺序,再说的详细一点,主机字节顺序可能是大端顺序或者小端顺序(这个要看编译器的设置,还有自己是用的C还是Java还是其他的语言,其各自都是不尽相同),但是网络字节顺序一定是大端顺序。

多说几句

为什么会有这个大端模式和小端模式呢?
这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为 8bit。但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具体的编译器),另外,对于位数大于 8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如何将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。例如一个16bit的short型x,在内存中的地址为0x0010,x的值为0x1122,那么0x11为高字节,0x22为低字节。对于 大端模式,就将0x11放在低地址中,即0x0010中,0x22放在高地址中,即0x0011中。小端模式,刚好相反。我们常用的X86结构是小端模式,而KEIL C51则为大端模式。很多的ARM,DSP都为小端模式。有些ARM处理器还可以随时在程序中(在ARM Cortex 系列使用REV、REV16、REVSH指令[1] )进行大小端的切换。

Linux网络通信----htonl()、htons()、ntohl()、ntohs()四个函数相关推荐

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

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

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

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

  3. htonl htons ntohl ntohs inet_pton inet_ntop

    字节序转换函数 uint32_t htonl(uint32_t hostlong)主机字节序到网络字节序长整型转换 uint32_t htons(uint16_t hostshort)主机字节序到网络 ...

  4. htons() ntohl() ntohs() htons()的区别及详解

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

  5. htons(), ntohl(), ntohs(),htons()这4个函数

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

  6. linux函数库之htons(), ntohl(), ntohs(),htons() 函数

    字节序分为大端字节序和小端字节序: 大端字节序: 是指一个整数的高位字节(32-31bit)存储在内存的低地址处,低位字节(0-7bit)存储在内存的高地址处. 小端字节序: 是指一个整数的高位字节( ...

  7. socket编程为什么需要htons(), ntohl(), ntohs(),htons() 函数

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

  8. 为什么需要htons(), ntohl(), ntohs(),htons() 函数

    为什么需要htons(), ntohl(), ntohs(),htons() 函数: 在C/C++写网络程序的时候,往往会遇到字节的网络顺序和主机顺序的问题.这是就可能用到htons(), ntohl ...

  9. htons java_socket编程为什么需要htons(), ntohl(), ntohs(),htons() 函数

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

  10. 网络字节与主机字节转换 htons(), ntohl(), ntohs(),htons() 函数

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

最新文章

  1. A 'return' expression required in a function with a block body ('{...}')
  2. kali 设置中文字体
  3. ubuntu18.04(bionic) 配置阿里数据源
  4. jzoj4815-ksum【堆】
  5. HDU2066:一个人的旅行
  6. React开发(138):ant design学习指南之anchor处理
  7. 【Python基础入门系列】第09天:Python tuple
  8. 归档和解档-Archiver
  9. MyBatis第1天
  10. Flex一个RemoteObject调用JAVA对象里面的多个方法
  11. 在软件测试中UT,IT,ST,UAT分别是什么意思
  12. 针对中东石油能源工业控制系统的又一网军诞生
  13. xen html插件天气不会刷新,天气通刷新不了怎么办 刷新不了解决方法
  14. 学习笔记10--多传感器融合定位技术
  15. ios 网速监控_IOS_网速流量实时监控
  16. 陶哲轩实分析定理 11.4.3 $\max$与$\min$保持黎曼可积性
  17. turtle库画图单击鼠标获取坐标位置
  18. Python中的os.chdir()函数:改变当前工作目录
  19. 培训官赵敏:学员就是我们的产品[摘自上海科技报]
  20. 每天一个小技巧【5】·数位板笔刷压感设置

热门文章

  1. dreamweaver半角空格_Dreamweaver常见问题解答
  2. iterm2 字体颜色
  3. 各浏览器的用户代理字符串整理
  4. WTL_Freecell v1.2 (WTL空当接龙v1.2) 20180112
  5. java获取专辑封面_android获取音乐文件的内置专辑图片实现思路及代码
  6. 新晋 CTO 的工作总结:我在第一年学到了 14 个经验教训
  7. 五个不用本人出镜拍摄的短视频领域,要选择适合自己的,抓紧收藏
  8. 币氪研报l Gxshare(GXS)
  9. 嵌入式开发学习的几种线路图方向
  10. 虚拟机设置固定ip地址