什么是字节序(端序、低端字节序、高端字节序、网络字节序)

2023-05-16

前言

一个内容为12(字符串)的文本文件,它的第一个字节是什么(小端序)?如果你的回答是0x32,那你真的应该好好理解下字节序了。如下图所示,我这里的正确答案是0x31。当然如果你的回答是不一定,这似乎也是对的。背后的原因比较复杂。
在这里插入图片描述

什么是字节序

首先,字节序又称端序,顾名思义“字节的顺序”。你可能会奇怪:字节还有顺序?让我们从生活中常见概念入手吧。

生活中的数

123456,如果让你把这串数读出来的话你肯定会说:“十二万三千四百五十六。”你瞧,从左往右,这就是我们读数字时的顺序。
那有没有从右往左看数字的时候呢?当然有!如果我让你计算123456+134659你肯定会先从个位算起(除非你想给自己找麻烦)。

把数存入内存

计算机不是神仙,它和你没有心灵感应。因此为了使CPU可以读取数据,我们要先把数据存入内存再让CPU读取。内存是按地址进行访问的存储器件。在内存中,每个字节都有它对应的地址。
那么,你要如何把数0x12345678存入内存呢?
在这里插入图片描述
一种存储方式如下所示。
在这里插入图片描述
当然你也可以选择另外一种存储方式。
在这里插入图片描述
以上两种方式没有对错之分,只要在存储和读取时保持一致即可。Intel公司的CPU普遍采用第二种方式。

字节序的小端序与大端序

  • 像Intel这样把数的低字节存在内存低地址处的方案,我们称作小端序(Little-Endian),全称字节序的小端序,又称低(小)端字节序等。
  • 反之,像第一种把数的高字节存在内存低地址处的方案,我们称作大端序(Big-Endian),全称字节序的大端序,又称高(大)端字节序等。

端序

你肯定要迫不及待地问,前文一直在说的究竟是什么呢?顾名思义,端(end)就是一边、一头、一端的意思:

  • 内存中,我们以低地址为端
  • 网络传输中,我们以0时刻发送的数据为

因此字节序的大端序更精确的定义为:位置更高(重要,significant)的字节在端;相反,字节的小端序更精确的定义为位置更低(不重要)的字节在端
大端序和小端序是两种不同的端序。现在Intel公司的CPU普遍采用字节小端序(字节序的小端序)。
因此下图以字节小端序读取的结果是0x78563412,以字节大端序读取的结果是0x12345678.
在这里插入图片描述

注意: 当数据按上图在内存中存储时,不存在(至少据我所知,不存在) 0x87654321或者0x21345678这样的读取顺序.这是因为内存是以字节为最小单位进行存取的,所以字节内比特(位)的顺序总是固定不变的。当数据在网络中传输时就会涉及到字节内位的顺序

数据在网络中传输

网络字节序

根据RFC791,网络传输时(精确地说是使用IP协议进行网络传输时)以太网采用大端字节序。也就是说,如果你想发送0x12345678,那先发送0x12字节,最后发送0x78字节。
上个自然段的意思是这样的。CPU是个傻瓜,他不知道你要发送什么。因此要发送的内容你是最清楚的。这就是说,如果下图是按低端字节序存储的,这意味着你存储的数是0x78563412。那么你就应该先发送0x78这个字节。反之如果下图是按大端字节序存储的,那根据RFC791,你应该先发送0x12. C语言中htonl、ntohl这两个函数可以帮我们解决主机字节序与网络字节序之间的转换问题。
在这里插入图片描述

网络比特序

以太网是串行传输数据的,即一次只能发送一个比特位。这样就引出了一个问题:我们知道,要想传输0x1234,需要先发送0x12这个字节,可是对于0x12我们应该先发送哪一位呢?
0x12的二进制写法是00010010B,因此有两种发送顺序。即,按照时间顺序依次发送0-0-0-1-0-0-1-0,或者反过来,发送0-1-0-0-1-0-0-0.

至于以太网在硬件层面是否真的是严格串行传输的,我并不清楚。因为ISO/IEC/IEEE 8802-3:2021居然有5千多页,鄙人才疏学浅,找不出来。

网络以0时刻为端,在发送0-0-0-1-0-0-1-0时比特的高位(重要的那一位)在端,我们称之为大端比特序;反之发送0-1-0-0-1-0-0-0时比特的低位(不那么重要的位)在端,我们称之为小端比特序。现在网卡会自动帮我们处理网络传输中的比特序问题,因此网卡交给CPU的数据是以字节为最小单位的。
以太网的比特序是小端序。

考考你

为了确保你真的懂了,我们来举个例子。下图为TCP(RFC9293)数据报的格式。我们将Data称为“体”(身体的体),将Data上面的部分称为“头”(脑袋的意思)。
在这里插入图片描述

从字节序的角度

我要问的是:在以太网中发送数据时,是先发送头还是先发送体呢?
鉴于你可能没学过计算机网络,那么我来告诉你:头比体更加重要。因此,先发送头就代表更重要的字节在端,即上文中字节序的大端序的定义,反之则为字节序的小端序。前文说过,以太网采用字节序的大端序进行传输,因此会先发送头。在上面那副图中,各个字段会按照从左往右的顺序依次发送出去。

从比特序的角度

那么再来一个问题,假设Source Port的值是0x55AA。网卡会先发送哪个比特呢?
首先明确肯定会先发送0x55这个字节(高端字节序)。0x55=01010101B.以太网采用比特序的小端序,最右面的比特1最不重要,因此1在端,即先发送1.因此,字节0x55AA的发送顺序为1-0-1-0-1-0-1-0-0-1-0-1-0-1-0-1.

开头的问题

在这里插入图片描述
严格地说,文件中没有“大小端序”这个概念,不然,文件在不同端序CPU的系统上将无法通用,这肯定是我们不希望看到的。
在C#中,文件是按字节写入,因此不存在端序的问题——你想写什么就写什么。
在这里插入图片描述
在test1文件中,由于使用的是小端序CPU,变量的第一个字节自然是0x78,第二个字节是0x56……C#会直接把这个数组原封不动地写入文件。至于test2,字符1的utf-8编码是0x31,2是0x32……C#也会将他们原样写入文件。很多高级语言都是这样。
在这里插入图片描述
需要特别注意:在计算机中,字节序的概念被限制在CPU中,对于字节序的讨论应该和CPU息息相关。例如,汇编语言、操作系统等。 同理,关于比特序的讨论应该被限制在需要它的地方——网络的物理层/数据链路层的底部。像内存、硬盘这些设备只要符合规范,就可以在任何端序的CPU中使用。换句话说,它们本身都没有字节序的概念。
所以如果你拿着wireshark的截图问我:为啥在小端的CPU中出现了大端序,这个……我只能说它编程时就是这么设计的。毕竟这样你用起来更舒服。
在这里插入图片描述

后记

正如我反复强调的,CPU是个傻瓜,它并不清楚你的意图,只是按照你的指示做事。你要做什么,你自己是最清楚的。
好比我问你10100001B到底是有符号数还是无符号数,答案是:它既是无符号数161也是有符号数-95. 至于怎么解释完全取决于你自己。
书是从左往右读的,但古代的书都是从右往左读。这并不会影响书籍的内容,只要写和读的时候顺序一致即可。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

什么是字节序(端序、低端字节序、高端字节序、网络字节序) 的相关文章

  • 谷歌浏览器网页缩放

    谷歌浏览器网页缩放 win xff1a Ctrl 43 43 或者 mac xff1a command 43 43 或者
  • mac系统传统映像必须转换解决方法

    mac系统传统映像必须转换解决方法 步骤一 xff1a 打开电脑自带的 磁盘工具 步骤二 xff1a 选择映像 gt 转换即可
  • ubuntu18.04 command not found: catkin_init_workspace

    使用catkin init workspace命令报错 xff1a command not found catkin init workspace 使用以下命令解决 xff1a source opt ros kinetic setup ba
  • intel realsense D400系列相机介绍(一)

    文章目录 intel realsense D42 intel realsense D400介绍2 3 立体视觉深度技术概述2 4 摄像机系统框图2 5 英特尔Intel RealSense 深度模块D400系列产品2 6 英特尔Intel
  • 宏定义(无参,有参,宏函数)(详细介绍)

    以符号 开头的命令 xff0c 如 xff1a span class token macro property span class token directive keyword define span N 10 span span cl
  • intel realsense 深度视野范围与模组硬件说明

    文章目录 4 4 距离 xff08 Z xff09 处的深度视场4 5 无效深度带4 6 最小测量深度4 7 深度质量规范4 8 深度起点 xff08 地面零点参考 xff09 4 8 1 深度原点X Y坐标 7 2 视觉处理器D4板外形7
  • jetson nano GPIO控制说明

    文章目录 一 GPIO介绍二 安装GPIO库python库C 43 43 库 三 几种常用的通信协议UARTPWMI2CI2SSPI 四 控制函数说明python xff08 参考 https pypi org project Jetson
  • jetson nano系统引导安装(无外设安装方式)

    文章目录 一 硬件设置二 系统设置 一 硬件设置 插入烧写好系统的SD卡将micro USB线接到jetson nano上 xff0c 另一端USB A接到电脑上为jetson nano插入电源 xff0c 开机等待电脑检测到如下盘符说明j
  • C中数据类型占用内存的大小

    数据类型表示存储何种类型的数据 xff0c 从内存来看 xff0c 就是占用的内存大小 C标准并未明确规定各数据类型占用多少字节的存储空间 各数据类型的内存大小与操作系统位数 编译器有关 xff0c 可以在代码中使用sizeof 进行查询
  • Linux与Windows文件系统互访

    1 概述 在软件开发过程中 xff0c 常涉及到Windows环境与Linux环境之间的切换 xff0c 实现代码的实时同步能有效提高工作效率 CIFS协议介绍 Common Internet File System CIFS xff0c
  • SDK、API、MDK、RTK有关系吗?到底是什么东西呢?

    SDK 软件开发工具包 缩写 SDK 外语全称 Software Development Kit 一般都是一些软件工程师为特定的软件包 软件框架 硬件平台 操作系统等建立应用软件时的开发工具的集合 软件开发工具包括广义上指辅助开发某一类软件
  • 大疆M3508电机使用CAN通信进行速度PID闭环控制详解

    目录 一 简介二 电机通信协议三 电机PID控制原理四 官方代码移植 中断接收五 官方代码移植 查询接收 一 简介 之前写过一篇文章STM32实现四驱小车 xff08 五 xff09 电机控制任务 电机速度PID控制算法 xff0c 其中是
  • 大疆M3508电机位置与速度PID控制及自编上位机调参

    目录 一 简介二 电机位置 速度 电流三闭环PID控制原理三 STM32实现位置 速度控制 xff08 一 xff09 电机数据接收 xff08 二 xff09 一些全局变量 xff08 三 xff09 电机PID初始化与位置 速度PID计
  • 相机内参与外参学习记录与理解

    1内参 内参 xff1a 在小孔成像模型中有一个光点P xff0c 其将光以直线的方式穿过纸板的小孔 光心 xff09 xff0c 射到显示纸板 xff08 物理成像平面 xff09 上 xff0c 其坐标系结构如下图所示 而内参的作用即是
  • 现代颜色技术原理及应用学习记录

    感谢CRFX下面分享的书 第一章
  • 【计算机网络】常见的HTTP报文头部信息

    常见的HTTP报文头部信息 HTTP首部字段根据实际用途被分为以下4种类型 1 通用首部 通用首部字段 xff08 General Header Fields xff09 请求报文和响应报文两方都会使用的首部 Cache Control x
  • imagenet 数据集读取数据速度记录

    电脑配置是固态硬盘 xff0c i7cpu xff0c 不进行计算 xff0c 只读数据 xff0c 不做数据增广 xff0c 只做resize 只看不赞不文明 xff0c 这是大约花费两天时间测试结果 目录 xff1a 1 xff0c 最
  • c++调python踩坑日志

    目录 import array 报错 矩阵互相转换 include numpy相关vs2019配置 数组太长报错 import array 报错 参考 xff1a https blog csdn net weixin 40232401 ar
  • pytorch 半精度训练

    必坑记录 这种训练直接变成nan了结果 实验结果 前者采用正常训练 后者改进为 from torch cuda amp import autocast as autocast 实验发现从一epoch44秒 xff0c 减少为35秒 但是训练
  • earth mover‘s distances学习记录

    https zhuanlan zhihu com p 145739750 后面的感觉没讲清楚 一开始我没想清楚 xff0c 为什么可以把问题转换成线性规划问题 问题转换一下 xff0c 一个工厂有A xff0c B xff0c C三个仓库

随机推荐

  • A Tutorial on Energy-Based Learning(机器学习能量模型)学习记录

    1 Introduction 其中Y是标签 X是输入 基于能量的机器学习模型即是寻找这样一个函数 和输入数据越接近 能量越小 给定一个输入 最好的模型即是对应的Y的值是真实值 这个真实值的能量是最小的 此模型可以做的工作有 预测 Ranki
  • dncnn(残差网络图像去燥记录)

    一 xff0c 生成训练数据 1 xff0c 原文相关知识 we use the noisy images from a wide range of noise levels e g 0 55 to train a single DnCNN
  • win10 10016自动重启错误解决记录

    1 xff0c 没解决 1352127440 xff0c 找到 组件服务 xff0c 然后依次展开组件服务 计算机 我的电脑 DCOM配置 xff0c 找到 9CA88EE3 ACB7 47C8 AFC4 AB702511C276 xff0
  • 无偏估计、有效性、相合性

    定义 xff1a 在已知概率分布函数构造的情况下 xff0c 概率分布的一些参数未知 xff0c 如高斯分布的namda 方差 xff0c 而利用采集到的参数来对未知参数进行估计就是参数估计 比较基础的有矩估计 最大似然估计 而不同的方法对
  • Windows10下安装point-cloud-annotation-tool点云标注工具——吐血之路总结

    零 为了标注点云数据 xff0c 经过多方查找免费开源的标注软件 xff0c 根据使用要求和方便程度最终选择了这款可以在Windows下编译安装的point cloud annotation tool xff0c 基于QT和vtk和PCL进
  • ROS 中CompressedImage消息的发布与订阅

    背景 xff1a 某些情况下需要录图像数据的包 xff0c 非常占空间和带宽 xff0c 尤其对于一些工业相机图像一张好几兆 xff0c 每秒30帧的话一份钟好几个G xff0c 这时候可以选择的订阅压缩图像 xff0c 下面直接来个dem
  • 【C#】简单的串口发送

    一 核心代码 xff1a SerialPort serialPort span class token operator 61 span span class token keyword new span span class token
  • 原生OKHttp以及OKHttpUtil的使用

    Android系统提供了两种HTTP通信类 xff0c HttpURLConnection和HttpClient 尽管Google在大部分安卓版本中推荐使用HttpURLConnection xff0c 但是这个类相比HttpClient实
  • c++编译器配置错误问题clang: error: linker command failed with exit code 1 (use -v to see invocation)

    背景 xff1a ubuntu18 04系统 之前装其他程序的时候安装了一些软件 xff0c 不知道什么时候g 43 43 编译器从 usr bin c 43 43 组里面给删掉了 xff0c 默认的编译器成了clang 43 43 xff
  • apollo7.0------浅谈激光雷达运动补偿(二)--计算解析

    背景介绍 运动补偿相关介绍参考第一篇博客 xff1a apollo7 0 浅谈激光雷达运动补偿 龙性的腾飞的博客 CSDN博客 lidar运动补偿 本篇博客主要解释一下上篇博客中运动补偿的计算部分 xff0c 简单来说就是一个利用四元数球面
  • Matlab激光雷达相机联合标定经验分享

    一 背景介绍 联合标定是做多传感器融合的基础工作 xff0c 也是一个没有最好只有更好的研究方向 xff0c 相关论文也是层出不穷 xff0c 网上也有许多开源的工作 xff0c 包括Autoware的工具箱我也试过 xff0c 感觉标定效
  • 如何更改Ubuntu系统的输出为HDMI(耳机,扬声器)?

    由于需要用HDMI外接音频设备 xff0c 故想要改变电脑输出 xff0c 本人用的为Ubuntu14 04 开始在网上搜寻怎么更改 xff0c 查到需在声音设置里面更改音频输出为HDMI xff0c 可当我打开声音设置 xff0c 嗯 x
  • PPT中插入图片背景透明化小技巧

    新版的编辑器真不适应 xff0c 费劲 xff01 xff01 xff01 最近两天做开题答辩ppt xff0c 发现了ppt中处理图片背景的一个小技巧 xff0c 在此分享给大家 PPT一般会带有背景图片 xff0c 那种带浅色调logo
  • ROS发布Float32MultiArray消息C++/Python

    在ros下发布一个字符串消息或整数消息 xff0c 网上例程不少 xff0c ROSwiki上也有教程 xff0c 有时就需要一次发送不止一个数据 xff0c 这时候就得用到数组了 xff0c C 43 43 的也好找 xff0c 不过py
  • c++中string、char *、char[]相互转换

    一 string转char 主要有三种方法可以将str转换为char 类型 xff0c 分别是 xff1a data c str copy 其中 xff0c copy 可能会报安全性错误 xff0c 自行解决即可 3 1 data 方法 s
  • char数组与char指针

    转载来源 xff1a https www cnblogs com nzbbody p 3553222 html https blog csdn net jack 20 article details 78913202 一 0 的添加 存在的
  • linux下tcpdump的使用

    简介 用简单的话来定义tcpdump xff0c 就是 xff1a dump the traffic on a network xff0c 根据使用者的定义对网络上的数据包进行截获的包分析工具 tcpdump可以将网络中传送的数据包的 头
  • khadas vim3安装ros1

    khadas vim3 按照网上的方法可以正常安装ros2 xff0c 但是按照ros1则可能会有一些奇奇怪怪的问题导致按照失败 xff0c 不过在一位群友的帮助下 xff0c 找到了解决的方法 khadas vim3 将源换为下面 xff
  • 【Android】CMake添加多个c文件

    1 准备工作 先下相关的插件 xff0c 进入setting xff0c 勾选这LLDB NDK CMake三个 xff0c 点击OK后即可下载 2 Native C 43 43 工程 简单总结一下CMake使用的操作步骤 1 新建Nati
  • 什么是字节序(端序、低端字节序、高端字节序、网络字节序)

    前言 一个内容为12 xff08 字符串 xff09 的文本文件 xff0c 它的第一个字节是什么 xff08 小端序 xff09 xff1f 如果你的回答是0x32 xff0c 那你真的应该好好理解下字节序了 如下图所示 xff0c 我这