缅怀先驱:提出字节序概念的以色列裔计算机科学家Danny Cohen1,于2019-08-22病逝,享年81岁2

目录

  • 名词释义
  • 概念由来
  • 设计原理
  • 应用场景
    • NBO(Net Bytes Order)
    • HBO(Host Bytes Order)

名词释义

Endianness译作字节顺序,又称端序、尾序、尾端序。目前主要在存储或者网络传输场景中,用于约定多字节数据的存储或发送顺序。

字节顺序有两种格式:

  • LITTLE-ENDIAN:小字节序,又称低字节序、小端序、小尾序、小尾端
    可速记为:高位高存
  • BIG-ENDIAN:大字节序,又称高字节序、大端序、大尾序、大尾端
    可速记为:高位低存

概念由来

计算机中数据都是按字节表达、每个字节固定8 bit。当数据较长时,我们会用多个字节来表示数据,如int数值需要4个字节。

多个字节要存储或者网络传输时,调用方/发送方和存储器/接收方势必要约定一个相同的顺序,才能保证数据的含义能被对方正确理解。

比如0xb1b2b3b4这个16进制的int值,一共4个字节。如果发送时按照0xb10xb20xb30xb4的顺序发送,而接收时认为发送方是按相反顺序返送,则会任务接收到的数据是0xb4b3b2b1,这就出现理解不一致。

在早期的计算机体系结构中,因为多字节存储和传输顺序并没有统一规则,上面的场景经常出现,尤其是网络通信非常困难。而对“网络传输中哪种字节排序更合适”的争论一时沸反盈天,已经脱离技术本身的考虑,实际的情况却迟迟得不到改善。

Danny Cohen认为:技术角度并不关心选择哪种字节顺序,重要的是行业需要统一的标准、大家坚持下去。于是在1980年由IETF发表的《论圣战与和平诉求》(On Holy Wars and a Plea for Peace)一文中,他引用了《格列佛游记》中的典故,并使用类似文中概念的little-endianbig-endian,分别表示小端序和大端序。自此这个概念被广泛采用。

Endianness词根Endian出自Jonathan Swift的《格列佛游记》,原文如下:

“…我下面要告诉你的是,Lilliput和Blefuscu这两大强国在过去的三十六个月里一直在苦战。战争开始时由于一下原因:我们大家都认为,吃鸡蛋前,原始的方法是打破鸡蛋较大的一端(big-end),可是当今皇帝的祖父小时候吃鸡蛋,一次按古法打鸡蛋时碰巧将一个手指弄破了,因此他的父亲,当时的皇帝,就下了一道赦令,命令全体臣民吃鸡蛋是打破鸡蛋较小的一端(little-end),违令者重罚。老百姓们对这项命令极为反感。历史告诉我们,由此曾发生过六次叛乱,其中一个皇帝送了命,另一个丢了王位。这些判断大多都是由Blefuscu的王国大臣们煽动起来的。叛乱平息后,流亡的人总是逃到那个帝国区寻求避难。据统计,先后几次有一万一千人情愿受死也不肯去打破鸡蛋较小的一端。关于这一争端,曾出版过几百本大部著作,不过大端派(big-endians)的书一直是受禁的,法律也规定该派的任何人不得做官。"

鸡蛋从哪头打破,怎么会有哪种更合适呢?对个人生活和社会发展又有什么意义呢?Swift写这段故事,其实是讽刺当时法国和英国的时政,认为真正重要的事情得不到关注、而在一些毫无意义的事情上争论不休。

这就是大端序和小端序的由来。下面介绍下两种排序的具体原理。

设计原理

我们假设有一个int0xb1b2b3b4(0x前缀代表16进制,共4个字节),要存入0x0000开头的内存地址(实际地址比这个要长,这里仅用作演示)。

那么两种规则的存放方式对比如下:

规则 内存
0x0000
内存
0x0001
内存
0x0002
内存
0x0003
big-endian 0xb1 0xb2 0xb3 0xb4
little-endian 0xb4 0xb3 0xb2 0xb1

上表体现了大端序和小端序的形式和区别,可以概括如下:

  • big-endian:高位字节存储在内存低位,简单理解为高(大)位字节(高位代表2的更大指数,数值也更大)先出现。
  • little-endian:高位字节存储在内存高位,简单理解为低(小)位字节先出现。

应用场景

NBO(Net Bytes Order)

网络字节序,普遍理解为TCP/IP协议中使用的字节序。
Danny Cohen当时确定的就是网络层面的字节序规则,最终TCP/IP各层协议统一采用Big-Endian

HBO(Host Bytes Order)

个人对处理器不甚了解,以下文字来自网络。

在现代“冯.诺依曼体系结构”的计算机中,数据都是采用二进制来存储、以字节(Byte)为单位、每个字节包含8位二进制数字(8 bits)。
目前有两大阵营,那就是Motorola的PowerPC系列CPU和Intel的x86系列CPU。PowerPC系列采用Big-Endian方式存储数据,而x86系列则采用Little-Endian方式存储数据。


大端和小端的形成有其历史原因,我们在理解的基础上,要明白发展才是硬道理。
得益于高级语言的发展,在现在的软件开发基本不需关心字节序(除非是socket编程),如Java这类跨平台移植的语言由虚拟机屏蔽了字节序问题。

JAVA虚拟机中多字节类型数据的存放顺序,也就是JAVA字节序是Big-Endian
可参考资料:

  • https://www.cnblogs.com/Alandre/p/4878841.html
  • https://www.cnblogs.com/thbCode/p/6018308.html

以上就是对little-endianbig-endian的全部介绍。

内存对齐有兴趣的朋友,可参考下面文章:

  • https://www.cnblogs.com/leezhm/archive/2011/07/19/2110864.html
  • https://www.cnblogs.com/thbCode/p/6018308.html

待更新:

  • 为什么一个字节定义为8 bit,定义长一些、足够存储最大的数据不就行了吗?
  • Java处理字节序的具体实现是怎么,如何将bit/byte输出为最终数据?
  • 开发中常见的数据检索、内存匹配等操作,是如何进行的、字节序如何运作?

  1. https://en.wikipedia.org/wiki/Danny_Cohen_(computer_scientist) ↩︎

  2. https://www.oschina.net/news/109269/danny-cohen-has-died ↩︎

什么是Little Endian和Big Endian?(Endianness:字节序、端序、尾序)相关推荐

  1. 字节序:Big Endian 和 Little Endian

    最近碰到了node.js中的buf.readUInt16LE(offset[, noAssert])方法:         根据指定的偏移量,使用特殊的 endian 字节序格式读取一个无符号 16 ...

  2. 整型,长整型,无符号整型等 大端和小端(Big endian and Little endian)

    一.大端和小端的问题 对于整型.长整型.无符号整型等数据类型,Big endian 认为第一个字节是最高位字节(按照从低地址到高地址的顺序存放数据的高位字节到低位字节):而 Little endian ...

  3. big endian and little endian

    big endian(大端)和little endian(小端)表示机器对变量字节的存储顺序.big endian表示低地址存放最高有效字节,little endian表示低地址存放最低有效字节.这里 ...

  4. Unicode、UTF-8、Big Endian、Little Endian、GBK、UCS-2

    Unicode.UTF-8.Big Endian.Little Endian.GBK.UCS-2 一.Unicode.UCS.GBK 1.开始计算机只在美国用.八位的字节一共可以组合出256(2的8次 ...

  5. URL编解码、Big Endian和Little Endian

    一.Endian的起源 在各种计算机体系结构中,对于字节.字等的存储机制有所不同,因而引发了计算机通信领域中一个很重要的问题,即通信双方交流的信息单元(比特.字节.字.双字等等)应该以什么样的顺序进行 ...

  6. CPU中的Little Endian与Big Endian

    CPU中的Little Endian与Big Endian 今天在学习利用buildroot编译软件包的时候,make menuconfig之后在Target Architecture选项中发现了同一 ...

  7. VB 文件编码互换模块(支持 Ansi,UTF-8,Unicode(little endian),Unicode big endian)

    'VB 文件编码互换模块,支持对Ansi,UTF-8,Unicode(little endian),Unicode big endian编码之间进行转换. Option Explicit Privat ...

  8. Little endian和Big endian的区别

    许多嵌入式系统程序员对Little endian和Big endian模式的概念模糊不清,其实Little endian和Big endian是多字节寻址的微处理器中,两种数据书写和存储顺序的排列方式 ...

  9. big endian与little endian

    很多人都知道big endian和little endian但是很少有人知道它们的实质,因为只要你在网上一google,出来的都是那个经典的典故,不可否认,那个典故很重要,但是那也仅仅是个故事而已,计 ...

最新文章

  1. oracle 数据库信息查询
  2. 验证视图状态MAC失败问题正确的解决办法
  3. 11.10 chkconfig:管理开机服务
  4. Java面试题整理,java常用排序算法图解
  5. 利用python创建学生管理系统软件代码赏析
  6. 工作簿长时间空闲时自动关闭
  7. 关联性挖掘--Apriori算法详解
  8. 【前端】jQuery事件处理
  9. redis+tomcat实现session共享
  10. Decide what you want,and go after it with everything you got!
  11. Shell中的grep、awk和sed的常用命令和语法
  12. 微服务架构【技术点3】--- [初级] windows下zookeeper的配置+dubbo服务提供者端+dubbo消费者端配置
  13. 数据库系统和数据库管理系统的定义以及数据库管理系统的作用
  14. lumion建筑可视化2.5小时的真实感渲染教程
  15. linux检测路径是否存在,不存在则创建指定路径
  16. u盘容量影响计算机运行速度,插u盘导致电脑运行速度慢的解决方法
  17. android对cpu硬件要求,Android手机想用64位处理器?系统阻碍
  18. 以CS1237为例来看ADC芯片两个基本指标
  19. V8 工作原理之编译器和解释器
  20. 需求挖掘的十三种方法

热门文章

  1. [JS逆向案例]安居客滑块分析
  2. 智慧物流之RFID仓库管理系统解决方案-新导智能
  3. PM2 部署 nodejs 项目
  4. 如何向领导汇报工作(5)
  5. 特别手持弹幕 技术支持 app's support
  6. NMS和Soft-NMS
  7. Java 第一个程序Hello World
  8. 小米路由器无法访问共享盘
  9. 谁是远程界的天花板?2023年5款最常用的远程软件横测:ToDesk、向日葵、TeamViewer、Splashtop、AnyDesk
  10. IM——直播互动场景