网络字节序和主机字节序详解!!!

网络字节序和主机字节序详解!!!我们都知道 如今的通讯方式已经趋向与多样化 异构通信 计算机软件 操作系统 nbsp nbsp nbsp 计算机硬件 内核架构 ARM x86 不同 也已经很普遍了 如 手机和电脑中的进行通信 同时 在计算机设计之初 对内存中数据的处理也有不同的方式 低位数据存储在低位地址处或者高位数据存储在低位地址处 然而 在通信的过程中 ISO OSI 模型和 TCP IP 四层模型中 数据被一步步封装 然

我们都知道,如今的通讯方式已经趋向与多样化,异构通信(计算机软件(操作系统) +    计算机硬件(内核架构,ARM,x86)不同)也已经很普遍了,如,手机和电脑中的进行通信,,,



同时,在计算机设计之初,对内存中数据的处理也有不同的方式,(低位数据存储在低位地址处或者高位数据存储在低位地址处),然而,在通信的过程中(ISO/OSI模型和TCP/IP四层模型中),数据被一步步封装(然后加入信息首部),当传到目的段时,被一步步解封,然后获取数据



从上面我们可以看出,数据在传输的过程中,一定有一个标准化的过程,也就是说:从主机a到主机b进行通信,

a的固有数据存储——-标准化——–转化成b的固有格式



如上而言:a或者b的固有数据存储格式就是自己的主机字节序,上面的标准化就是网络字节序(也就是大端字节序)



a的主机字节序———-网络字节序 ———b的主机字节序





主机字节序:

就是自己的主机内部,内存中数据的处理方式,可以分为两种:

大端字节序(big-endian):按照内存的增长方向,高位数据存储于低位内存中

小端字节序(little-endian):按照内存的增长方向,高位数据存储于低位内存中

网络字节序和主机字节序详解!!!

但是,如何知道我们的主机是那一种的呢???这个我们可以通过程序来进行验证:



<span style="font-size:18px;">#include <stdio.h> #include <arpa/inet.h> int main(){ unsigned long a = 0x; unsigned char *p = (unsigned char *)(&a); printf("主机字节序:%0x %0x %0x %0x\n", p[0], p[1], p[2], p[3]); unsigned long b = htonl(a); //将主机字节序转化成了网络字节序 p = (unsigned char *)(&b); printf("网络字节序:%0x %0x %0x %0x\n", p[0], p[1], p[2], p[3]); return 0; } </span>

运行结果:

网络字节序和主机字节序详解!!!

可以看到我的当前主机是:小端字节序



关于:htonl

<span style="font-size:18px;">#include <arpa/inet.h> uint32_t htonl(uint32_t hostlong); uint16_t htons(uint16_t hostshort); uint32_t ntohl(uint32_t netlong); uint16_t ntohs(uint16_t netshort);</span>



h是主机host,n是网络net,l是长整形long,s是短整形short,所以上面这些函数还是很好理解的

<span style="font-size:18px;">#include <stdio.h> #include <arpa/inet.h> int main() { struct in_addr ipaddr; unsigned long addr = inet_addr("192.168.1.100"); printf("addr = %u\n", ntohl(addr)); ipaddr.s_addr = addr; printf("%s\n", inet_ntoa(ipaddr)); return 0; } </span>

运行结果:

网络字节序和主机字节序详解!!!

值得注意的是:

in_addr_in   inet_addr(const char *strptr);

inet_addr的参数是一个:点分十进制字符串,返回的值为一个32位的二进制网络字节序的IPv4地址,不然的话就是:INADDR_NONE

而返回值为:in_addr_t:IPv4,一般为uint32_t

所以也可以定义为:unsigned long

char * inet_ntoa(struct in_addr inaddr);

参数是一个结构体,所以要调用必须先定义一个结构体。



版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/230428.html原文链接:https://javaforall.net

(0)
上一篇 2026年2月23日 下午3:01
下一篇 2026年2月23日 下午3:22


相关推荐

  • Pi:OpenClaw使用的AI代理

    Pi:OpenClaw使用的AI代理

    2026年3月13日
    1
  • sql镶嵌查询_SQL数据查询之——嵌套查询「建议收藏」

    sql镶嵌查询_SQL数据查询之——嵌套查询「建议收藏」一、概念描述在SQL语言中,一个SELECT-FROM-WHERE语句称为一个查询块。将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询。例如:SELECTSname/*外层查询或父查询*/FROMStudentWHERESnoIN(SELECTSno/*内层查询或子查询*/FROMSCWHERECno=’2′);SQL语言允…

    2022年8月10日
    9
  • jdbc连接mysql8.0数据库_java jdbc连接数据库步骤

    jdbc连接mysql8.0数据库_java jdbc连接数据库步骤首先确认自己的mySQL数据库是多少版本,5.0版本和8.0版本在代码上会有很大的不同并且驱动包也不同8.0使用的是com.mysql.cj.jdbc.Driver,5.0使用的是com.mysql.jdbc.Driver。下面直接上8.0的代码Class.forName(“com.mysql.cj.jdbc.Driver”);conn=DriverManager.getConnection(“jdbc:mysql://localhost:3306/地址?use

    2025年10月11日
    6
  • mbus总线电路_CPU电路

    mbus总线电路_CPU电路发送也就是24V,36V切换,24V低电平,36V是高电平;主机接收电路可以高端放大也可以低端放大,设备端只会消耗固定的电流,mbus网络趋于稳定,负载时稳定的,当设备端发送数据时,mbus网络中电流会有所变化,通过采样电阻,电压跟随器,差分放大,采样保持电路,获取ttl电平,短路过载保护也是通过低端采样电阻控制供电开关的。…

    2022年10月15日
    3
  • es6数组常用函数方法

    es6数组常用函数方法//一,Array.from()将一组类似数组的对象转换为数组letsetx=newSet([1,2,3,4]);letarr=Array.from(setx);console.log(arr);//结果:[1,2,3,4]//二,Array.of(值1,值2,值3……)将一组值转换位数组leta=’12344′;letb=’2345′;le…

    2022年5月7日
    51
  • 定制SwipeRefreshLayout

    定制SwipeRefreshLayoutSwipeRefreshLayout大家都用过,google推出的,亲生儿子,兼容性自然最好!可是SwipeRefreshLayout只支持下拉刷新,没有上拉加载更多,这样是没办法满足我们的需要的,所以本文就对它进行一下定制,加上下拉刷新。首先贴用法:xml:

    2022年6月25日
    33

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号