计算机网络 —— 网络字节序

news2024/11/17 19:30:41

网络字节序

1、网络字节序 (Network Byte Order)和本机转换

1、大端、小端字节序

“大端” 和” 小端” 表示多字节值的哪一端存储在该值的起始地址处;小端存储在起始地址处,即是小端字节序;大端存储在起始地址处,即是大端字节序。

  • ① 大端字节序(Big Endian): 最高有效位存于最低内存地址处,最低有效位存于最高内存地址处;

  • ② 小端字节序(Little Endian):最高有效位存于最高内存地址,最低有效位存于最低内存地址处。

“高位数据"和"低位数据”

通常指的是数据在存储或传输时的位置或顺序。在处理二进制数据、字节序、位操作以及数据存储时非常常见,用于描述数据的物理存储方式或传输顺序。

  • 高位数据:指的是数据的高阶位或高字节,通常存储在数据块的起始位置或最高有效位(Most Significant Bit,MSB)。在多字节数据中,高位数据对应于数据的较高位部分。

  • 低位数据:指的是数据的低阶位或低字节,通常存储在数据块的末尾或最低有效位(Least Significant Bit,LSB)。在多字节数据中,低位数据对应于数据的较低位部分。

如下图:当以不同的存储方式,存储数据为 0x12345678 时:

视角 1
在这里插入图片描述

视角 2

在这里插入图片描述
视角 3
在这里插入图片描述

网络字节序:大端字节序

网络上传输的数据都是字节流,对于一个多字节数值,在进行网络传输的时候,先传递哪个字节?
也就是说,当接收端收到第一个字节的时候,它将这个字节作为高位字节还是低位字节处理,是一个比较有意义的问题。

UDP/TCP/IP 协议规定:把接收到的第一个字节当作高位字节看待, 这就要求发送端发送的第一个字节是高位字节;而在发送端发送数据时,发送的第一个字节是该数值在内存中的起始地址处对应的那个字节。换句话说,该数值在内存中的起始地址处对应的那个字节就是要发送的第一个高位字节。

所以,网络字节序就是大端字节序, 有些系统的本机字节序是小端字节序,有些则是大端字节序,为了保证传送顺序的一致性, 网际协议使用大端字节序来传送数据

如何验证自己的机器采用了哪种字节顺序:

/* 确定你的电脑是大端字节序还是小端字节序 */
#include <stdio.h>

int check1()
{
	int i = 1; //1在内存中的表示: 0x00000001
	char *pi = (char *)&i; //将int型的地址强制转换为char型
	return *pi == 0; //如果读取到的第一个字节为1,则为小端法,为0,则为大端法
}

int main()
{
	if (check1() == 1)
		printf("big\n");
	else
		printf("little\n");

	return 0;
}

第二种方法,用联合结构解决,其本质差异不大

/* 确定你的电脑是大端字节序还是小端字节序 */
#include <stdio.h>

int check2()
{
	union test {
		char ch;
		int i;
	}test0;
	test0.i = 1;
	return test0.ch == 0;
}
int main()
{
	if (check1() == 1)
		printf("big\n");
	else
		printf("little\n");

	return 0;
}

12345678910111213141516171819202122232425262728293031323334353637383940414243

因为联合结构中的变量共用一块存储空间,所以 ch 和 i 拥有同一个地址:
在这里插入图片描述

对本例中的联合结构,对它求 sizeof(test0),会发现它的大小为 4,取了 int 的大小。

关于 union,它里边的变量共用一块存储空间,但是它的大小并不总是其中最大的变量所占的空间,还需要考虑对齐!

比如:

union test1 {

char[5];

int i;

}

它的大小就是 8 了!
123456789101112131415

2、字节序转换函数

/* 字节序转换函数 */
 #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);

 说明:h -----host;n----network ;s------short;l----longhtons()--"Host to Network Short"
htonl()--"Host to Network Long"
ntohs()--"Network to Host Short"
ntohl()--"Network to Host Long"
1234567891011121314

为什么在数据结构 struct sockaddr_in 中, sin_addr 和 sin_port 需要转换为网络字节顺序,而 sin_family 不需要呢?

答案是: sin_addrsin_port 分别封装在包的 IPUDP 层。因此,它们必须是网络字节顺序。但是 sin_family 域只是被内核 (kernel) 使用来决定在数据结构中包含什么类型的地址,所以它必须是本机字节顺序。同时, sin_family 没有发送到网络上,它们可以是本机字节顺序

IP 地址如何处理:地址转换函数

IP 地址的三种表示格式及在开发中的应用

  • 1)点分十进制表示格式
  • 2)网络字节序格式
  • 3)主机字节序格式

用IP地址127.0.0.1为例:

  第一步   127   .     0     .     0      .    1   把IP地址每一部分转换为8位的二进制数。

 第二步 01111111     00000000     00000000     00000001      =   2130706433   (主机字节序)

      然后把上面的四部分二进制数从右往左按部分重新排列,那就变为:

  第三步 00000001     00000000     00000000    01111111        =   16777343        (网络字节序)
1234567

1、函数inet_addr(),将 IP 地址从 点数格式转换成无符号长整型。使用方法如下:

函数原型

in_addr_t inet_addr(const char *cp);

12

转换网络主机地址(点分十进制)为网络字节序二进制值,

  • cp 代表点分十进制的 IP 地址,如 1.2.3.4
  • 如果参数 char *cp 无效则返回 - 1 (INADDR_NONE),
  • 此函数有个缺点:在处理地址为 255.255.255.255 时也返回 - 1,虽然它是一个有效地址,但 inet_addr () 无法处理这个地址。

使用

ina.sin_addr.s_addr = inet_addr("132.241.5.10");
1

现在可以将 IP 地址转换成长整型了。有没有其相反的方法可以将一个 in_addr 结构体输出成点数格式?

2、你就要用到函数 inet_ntoa()(“ntoa"的含义是"network to ascii”),就像这样:
函数原型

char* inet_ntoa(struct in_addr in);
1

参数:

  • in 代码 in_addr 的结构体,其结构体如下:
struct in_addr 
{
    union 
    {
        struct { UCHAR s_b1,s_b2,s_b3,s_b4; } S_un_b;
        struct { USHORT s_w1,s_w2; } S_un_w;
        ULONG S_addr;
    } S_un;
};
123456789

使用

SOCKADDR_IN sock;
sock.sin_family = AF_INET;
//将字符串转换为 in_addr 类型
sock.sin_addr.S_un.S_addr =  inet_addr("192.168.1.111");
sock.sin_port = htons(5000);
 
//将 in_addr 类型转换为字符串
printf("inet_ntoa ip = %s\n",inet_ntoa(sock.sin_addr));


结果输出:
inet_ntoa ip = 192.168.1.111
123456789101112

注意:
inet_ntoa()将结构体in_addr作为一个参数,不是长整形。需要注意的是它返回的是一个指向一个字符的指针,一个由inet_ntoa() 控制的静态的固定的指针,所以每次调用 inet_ntoa(),它将覆盖上次调用时所得的 IP 地址
例如:

char *a1, *a2;

……

a1 = inet_ntoa(ina1.sin_addr); /* 这是198.92.129.1 */

a2 = inet_ntoa(ina2.sin_addr); /* 这是132.241.5.10 */

printf("address 1: %s\n",a1);

printf("address 2: %s\n",a2);

输出如下:

address 1: 132.241.5.10

address 2: 132.241.5.10

Via:

计算机网络——网络字节序(大端字节序(Big Endian)\小端字节序(Little Endian)

https://blog.csdn.net/JMW1407/article/details/108637540

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1857317.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

分类预测 | ZOA-PCNN-AT-SVM斑马优化并行卷积-支持向量机融合注意力机制的故障识别

分类预测 | ZOA-PCNN-AT-SVM斑马优化并行卷积-支持向量机融合注意力机制的故障识别 目录 分类预测 | ZOA-PCNN-AT-SVM斑马优化并行卷积-支持向量机融合注意力机制的故障识别分类效果基本描述程序设计参考资料 分类效果 基本描述 1.ZOA-PCNN-AT-SVM斑马优化并行卷积-支持向量机融…

昇思25天学习打卡营第1天|FCN图像语义分割》

全卷积网络&#xff08;Fully Convolutional Networks&#xff0c;FCN&#xff09;是UC Berkeley的Jonathan Long等人于2015年在Fully Convolutional Networks for Semantic Segmentation一文中提出的用于图像语义分割的一种框架。 论文地址&#xff1a;https://arxiv.org/pdf…

【云计算 复习】第6节 AWS亚马逊

一、基础存储架构Dynamo 1.概述 &#xff08;1&#xff09;为了保证其稳定性&#xff0c;Amazon的系统采用完全的分布式、去中心化的架构。 &#xff08;2&#xff09;Dynamo只支持简单的键值对方式的数据存储&#xff0c;不支持复杂的查询 &#xff08;3&#xff09;Dynamo中…

揭秘未来艺术:AI绘画工具全面介绍

&#x1f4d1;前言 随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;已经逐渐渗透到我们生活的方方面面。在艺术创作领域&#xff0c;AI技术同样展现出了其独特的魅力。今天&#xff0c;我们就来一起探索这个神秘而引人入胜的领域&#xff0c;深入了解AI绘画…

车联网全方位安全适配与领先架构

设想一下如下场景&#xff1a; 您钟爱的座驾&#xff0c;在毫无外力破坏迹象的情况下&#xff0c;突然被侵入&#xff0c;远程启动&#xff0c;然后绝尘而去… 别以为这只是大银幕上的虚构桥段&#xff0c;事实上&#xff0c;这一幕在现实中已经上演。 某款备受欢迎的车型&a…

【数列极限证明大题】解题方法,证明数列极限存在并求此极限,单调有界准则

文章目录 数列极限证明大题1.单调有界准则1.1 证有界性和单调性 1.2真题实战1.2 证明有界性中常用到的不等式 写在最前&#xff0c;持续更新中 数列极限证明大题 数列极限的证明大题的目标是&#xff0c;证明数列极限存在且求此极限。 核心方法是&#xff1a;单调有界准则&…

重磅消息:ONLYOFFICE8.1版本桌面编辑器发布:功能完善的 PDF 编辑器、幻灯片版式、改进从右至左显示、新的本地化选项等

目录 ONLYOFFICE介绍 PDF 编辑器 功能全面的 PDF 编辑器 文本编辑 页面处理 &#xff08;添加、旋转、删除&#xff09; 插入和调整各种对象&#xff0c;例如表格、形状、文本框、图像、TextArt、超链接、方程等。 此外 PDF 表单 文本文档编辑器更新内容 页面颜色 页面…

如何使用 ArcGIS Pro 和 Landsat 8 影像计算叶绿素指数和全球环境监测指数

GIS 工具和技术的出现极大地帮助了识别、量化和解决问题。GIS 还通过研究可能的情况并实施预防方案提供了一种主动的解决方案。多年来&#xff0c;GIS 通过电信和网络服务、事故/事件分析、城市规划、交通规划、环境影响评估、洪水损失估计、自然资源管理、环境健康和安全、植被…

JVS开源底座与核心引擎的全方位探索,助力IT智能、高效、便捷的进化

引言 JVS产品的诞生背景 JVS是软开企服构建的一站式数字化的解决方案&#xff0c;产生的背景主要来源于如下几个方面&#xff1a; 企业数字化需求的增长&#xff1a;企业对IT建设的依赖程度越来越高&#xff0c;数字化、指标化的经营已经是很多企业的生存的基础和前提&#…

Java项目:垃圾分类信息网站(java+springboot+vue+mysql)

列表 */ IgnoreAuth RequestMapping(“/list”) public R list(RequestParam Map<String, Object> params,ConfigEntity config){ EntityWrapper ew new EntityWrapper(); PageUtils page configService.queryPage(params); return R.ok().put(“data”, page);…

虚幻引擎 Gerstner Waves -GPU Gems 从物理模型中实现有效的水体模拟

这篇文章重点在于结合GPU Gems一书中有关Gerstner Waves 的数学公式&#xff0c;在虚幻引擎中复现正确的Gerstner Waves和正确的法线 文中内容整理自书中&#xff0c;并附带我的理解&#xff0c;与在虚幻引擎中的实现&#xff0c;可以参考原文看这篇文章&#xff0c;原文网上很…

大模型时代,普通人的科研何去何从

前言 随着大模型技术的飞速发展和普及&#xff0c;我们已经步入了一个全新的科研时代。在这个时代&#xff0c;大数据、深度学习和人工智能等前沿技术成为了推动科研创新的重要引擎。 那么&#xff0c;面对如此迅猛的发展势头&#xff0c;普通人科研该何去何从呢&#xff1f;…

【离散数学】图的随机生成和欧拉(回)路的确定(c语言实现)

实验要求 变量定义 因为如果我们使用局部变量&#xff0c;每一个函数都会使用这些变量&#xff0c;会让函数的参数越变越多。所以我们定义全局变量&#xff0c;这样就不用在参数中调用了。 #define MAX 100 int arrMap[MAX][MAX] { 0 };//图的矩阵 int degree[MAX] { 0 };…

vue2+webpack 和 vite+vue3 配置获取环境变量(补充)

相关涉及知识点可看小编该文章&#xff1a; nginx: 部署前端项目的详细步骤&#xff08;vue项目build打包nginx部署&#xff09;_前端工程打包部署到nginx-CSDN博客 1.vue2webpack 我们通常会在项目中看到这么两个文件(没有则自己创建&#xff0c;文件名&#xff1a;.env.***) …

热腾腾的,仓颉cangjie和C#的初战

花了一个下午快速浏览了一下仓颉&#xff08;Cangjie&#xff09;的文档。总体感觉&#xff0c;仓颉把现代编程语言的各种特征都融合在一起&#xff0c;称它为“缝合怪”一点都不夸张。没有历史包袱的确让它看起来很爽。由于目前还无法实际试用它&#xff0c;所以编译和运行性能…

Apache Doris 基础 -- 视图和物化视图

1、视图 视图(逻辑视图&#xff0c;logical views)是封装了一个或多个SELECT语句的存储查询&#xff08;stored queries&#xff09;。视图在执行时动态访问和计算数据库数据。视图是只读的&#xff0c;可以引用任何表和其他视图的组合。 视图可用于以下目的: 通过对用户隐藏…

全行业通用商城小程序源码

一站式购物新体验 一、引言&#xff1a;开启数字化购物新时代 在数字化快速发展的今天&#xff0c;小程序成为了商家们连接消费者的重要桥梁。特别是“全行业通用商城小程序”&#xff0c;以其便捷的购物体验和多样化的功能&#xff0c;成为了越来越多商家和消费者的首选。本…

mabl:AI原生测试自动化平台的基础使用

mabl&#xff1a;AI原生测试自动化平台的基础使用 简介注册登录安装基本使用创建第一个浏览器测试 Mabl的AI驱动测试能力自动化测试开发与维护异常监测与根源分析高级分析与报告自适应测试执行跨平台兼容性测试 简介 mabl 是一个基于人工智能和机器学习的云原生测试自动化平台…

学习记录之数学表达式(5)

文章目录 十、线性回归10.1 示例10.2 拟合10.3 推导10.4 岭回归10.5 作业 十一、Logistic回归11.1 分割超平面11.2 点到直线的距离11.3 sigmoid函数11.4 优化目标11.5 求解11.6 作业 十、线性回归 线性回归是一个常用的机器学习算法&#xff1b; 10.1 示例 表 1.单变量的股价预…