字节序——Big Endian和Little Endian

article/2025/9/8 10:46:44

Big Endian和Little Endian

    • 一、Endian 的起源
    • 二、字节序之 Little-Endian&Big-Endian
    • 三、为什么要注意字节序
    • 四、网络序和主机序
    • 五、Go 中的字节序

一、Endian 的起源

在各种计算机体系结构中,对于字节、字等的存储机制有所不同,因而引发了计算机通信领域中一个很重要的问题,即通信双方交流的信息单元(比特、字节、字、双字等等)应该以什么样的顺序进行传送。如果不达成一致的规则,通信双方将无法进行正确的编/译码从而导致通信失败。

1980 年,Danny Cohen 在其著名的论文”On Holy Wars and a Plea for Peace”中为了平息一场关于在消息中字节该以什么样的顺序进行传送的争论而引用了该词。该文中,Cohen 非常形象贴切地把支持从一个消息序列的最高位开始传送的那伙人叫做 Big-Endians,支持从最低位开始传送的相对应地叫做 Little-Endians。此后 Endian 这个词便随着这篇论文而被广为采用。

二、字节序之 Little-Endian&Big-Endian

首先,明确一点,咱们接触到的物理单元最小都是字节;因此,无论是 big endian,还是 little endian,都是针对多个字节的序列而言的;当然,在通信领域中,这里往往是 bit,不过原理也是类似的

对于字节序列的存储格式,目前有两大阵营,那就是 Motorola 的 PowerPC 系列 CPU 和 Intel 的 x86 系列 CPU。PowerPC 系列采用 big endian 方式存储数据,而 x86 系列则采用 little endian 方式存储数据。那么究竟什么是 big endian,什么又是 little endian 呢?

  • Little-endian:将低序字节存储在起始地址(低位编址)

  • Big-endian:将高序字节存储在起始地址(高位编址)

案例:

字节序

注:每个地址存 1 个字节,2 位 16 进制数是 1 个字节(0xFF=11111111)

上面的图已经够直观了。也就是说:

  • Big Endian 是指低地址端 存放 高位字节。
  • Little Endian 是指低地址端 存放 低位字节。

各自的优势:

  • Big Endian:符号位的判定固定为第一个字节,容易判断正负。
  • Little Endian:长度为 1,2,4 字节的数,排列方式都是一样的,数据类型转换非常方便。

三、为什么要注意字节序

如果你写的程序只在单机环境下面运行,并且不和别人的程序打交道,那么你完全可以忽略字节序的存在。

但是,如果你的程序要跟别人的程序产生交互呢? 比如,当一个 C/C++ 的程序要与一个 Java 程序交互时:

  • C/C++语言编写的程序里数据存储顺序是跟编译平台所在的 CPU 相关的,而现在比较普遍的 x86 处理器是 Little Endian

  • JAVA 编写的程序则唯一采用 Big Endian 方式来存储数据

  • Go 编写的程序可自主选择使用哪个字节序,有开发者来约定

试想,如果你的 C/C++程序将变量 a = 0x12345678 的首地址传递给了 Java 程序,由于 Java 采取 Big Endian 方式存储数据,很自然的它会将你的数据翻译为 0x78563412。显然,问题就出现了!!!

另外,网络传输一般采用 Big Endian,也被称之为网络字节序,或网络序。当两台采用不同字节序的主机通信时,在发送数据之前都必须经过字节序的转换成为网络字节序后再进行传输。

四、网络序和主机序

网络字节序: TCP/IP 各层协议将字节序定义为 Big Endian,因此 TCP/IP 协议中使用的字节序是大端序。

主机字节序: 整数在内存中存储的顺序,现在 Little Endian 比较普遍。(不同的 CPU 有不同的字节序)

在进行网络通信时 通常需要调用相应的函数进行主机序和网络序的转换。

五、Go 中的字节序

Go 中处理大小端序的代码位于 encoding/binary包,其中全局变量 BigEndian 用于操作大端序数据,LittleEndian 用于操作小端序数据,这两个变量所对应的数据类型都实行了 ByteOrder 接口:

type ByteOrder interface {Uint16([]byte) uint16Uint32([]byte) uint32Uint64([]byte) uint64PutUint16([]byte, uint16)PutUint32([]byte, uint32)PutUint64([]byte, uint64)String() string}

其中,前三个方法用于读取数据,后三个方法用于写入数据。

大家可能会注意到,上面的方法操作的都是无符号整型,如果我们要操作有符号整型的时候怎么办呢?很简单,强制转换就可以了,比如这样:

func PutInt32(b []byte, v int32) {binary.BigEndian.PutUint32(b, uint32(v))
}

为了程序的兼容,我们在开发跨服务器的 TCP 服务时,每次发送和接受数据都要进行转换,这样做的目的是保证代码在任何计算机上执行时都能达到预期的效果

参考:

go 语言的字节序

Big Endian 和 Little Endian 详解

字节序:Big Endian 和 Little Endian


http://chatgpt.dhexx.cn/article/nRx3u7fk.shtml

相关文章

小端格式和大端格式(Little-EndianBig-Endian)

小端格式和大端格式(Little-Endian&Big-Endian) 1 字节序 字节序,也就是字节的顺序,指的是多字节的数据在内存中的存放顺序。 在几乎所有的机器上,多字节对象都被存储为连续的字节序列。 例如:如果C/C中的一个int型变量 a…

BIG-ENDIAN VS LITTLE-ENDIAN

1. 计算机硬件有两种储存数据的方式:大端字节序(big endian)和小端字节序(little endian)。 举例来说,数值0x2211使用两个字节储存:高位字节是0x22,低位字节是0x11。 字节序&…

什么是字节序? Big-Endian vs Little-Endian 举例说明

计算机只理解二进制。这意味着 0 和 1 构成了计算机使用的语言。 一位是 0 或 1 。8 位组成一个字节。从这些简单的部分,我们可以构建极其复杂的连接计算机系统来渲染视频、显示来自世界各地的文本并计算极其复杂的算法。 一些数据(一些英文字符&#…

java -- Big Endian and Little Endian 大端和小端概念讲解及如何转换

什么是大端、小端? 字节是计算机中数据处理的基本单位。 计算机中以字节为单位存储和解释信息,规定一个字节由八个二进制位构成,即1个字节等于8个比特(1Byte8bit)。 计算机进行数据处理时,一次存取、加工和…

浅谈大小端(Endian)与位域

目录 字节序 位序 常见位序的错误理解 以太网的大小端 以太网的字节序 以太网的位序 位域中的大小端 位域遇上大小端以太网通信 大端CPU发送 小端CPU发送 位域大小端问题的解决措施 大小端问题浪费了太多应用、驱动、逻辑工程师太多的时间,无时无刻都有人…

Endian

字节序(Endian)即字节顺序(Byte-Order),又称为端序或尾序(Endianness)。描述的是计算机如何组织字节组成对应的数字,是多字节数据存储和传输时字节的顺序, 是多字节数据在…

一个神奇的网站 Papers with code

这个网站会把某个方向的 论文和代码总结出来。 有助于提高个人效率。 https://paperswithcode.com/sota

这是一个神奇的网站

2012年1月9日,下午2点,打开www.12306.cn.硬是提交了100多次才进入这个神奇的网站。结果又提交了100多次订单才成功了,很不幸运的是尼玛硬座的,等等是无号的...

【工具】sci-hub:一个神奇的免费下载文献的网站

title: “【工具】sci-hub:一个神奇的免费下载文献的网站” date: 2019-09-20T10:44:5508:00 lastmod: 2019-09-20T10:44:5508:00 tags: [“工具”,“sci-hub”] categories: [“工具”] sci-hub:一个神奇的免费下载文献的网站(使用技巧&…

最近发现的几个神奇CS学习网站

最近发现的几个CS学习网站,真的灰常良心,希望自己以后少吃瓜,多看看别人的路线和学习笔记。 一、北大信科大佬的CS笔记 https://csdiy.wiki/#_8 自己也是打算学习各种国外的优质课程(最近在学CS224n课程和做对应的project&…

冷门但超级有用的神奇网站推荐

给大家介绍一些神奇的具有强大功能的网站,有些功能特别的有用 查询名下手机号 https://getsimnum.caict.ac.cn 查询内容将以短信的形式下发到手机,一个人一天只能查询一次,因为是工信部出品的,所以安全性十分有保障 查询手机号…

快速下载一个网站

有时候我们需要分析一个网站,或者基于一个网站进行魔改,这个就需要一些特殊的手段将网站源码下载到本地了,其实目前大部分网站都是有代码压缩的,很难去有修改。 这里我就教大家如何快速获取一个网站的所有资源,包括源码…

给理工男女的一个神奇网站!

2018 AI开发者大会是一场由中美人工智能技术高手联袂打造的AI技术与产业的年度盛会!这里有15硅谷实力讲师团、80AI领军企业技术核心人物、100技术&大众实力媒体、1500AI专业开发者——我们只讲技术,拒绝空谈! 参加 2018 AI开发者大会&…

推荐一个命名变量的神奇网站 CODELF

推荐一个命名变量的神奇网站 CODELF 在我们写程序的时候,总是需要去给各种变量命名。于是各种命名大法都上来了,有拼音的,有首字母缩写的,各种各样。而我们推荐的命名肯定是英文的驼峰命名。今天给大家推荐一个网站:h…

mc神奇宝贝服务器网站,我的世界1.12.2 master 神奇宝贝服务器

———— 服务器名称:master—神奇宝贝 ———— 服务器版本:1.12.2 ———— 服务器类型:神奇宝贝 ———— 服务器的IP:进群下载客户端 ———— 服务器QQ群:609019804 ———— 服务器特色 游戏模式:休闲…

Craigslist :一个神奇的网站

转载:https://blog.naaln.com/2017/05/a-magic-website-raigslist/ 今天在看书的时候看到一个问题,什么是一个好产品?是好用的,还是好看的? 显而易见,应该是一个好用的产品。有什么产品是特别好看&#xff…

codewars 一个很神奇的网站

今天闲着无聊,逛推酷,无意间发现了一篇很有意思的帖子,帖子里写了国外的一个很有意思的网站,叫codewars ,这个网站的宗旨是把写代码 当成像打怪升级一样。上面有很多的题目,你可以用你熟悉的语言答题&…

p站,一个神奇的网站

说起p站,不少人老司机肯定想到的是那一个p站,但今天我要说的是另一个----pixiv,一个插画网站。 不知道什么原因,网站在国内被墙了,想弄个随机图片还得翻墙,但由于服务器网速实在太慢了,只能网上…

记录一个神奇的网站

Aurorahttps://arr003.network/

给理工男女的一个神奇网站

十一长假已经只剩下最后两天,你给自己定下的假期学习计划进展如何? 你是在家,还是在想家,还是在其他国家? 为了让家里蹲的诸位不虚度光阴,也为了让那些堵在高速路上的童鞋打发时间,现隆重给大家…