ENDIAN的由来及BIG-EDIAN 和LITTLE-ENDIAN(转)

在各种计算机体系结构中,对于字节、字等的存储机制有所不同,因而引发了
计算机通信领域中一个很重要的问题,即通信双方交流的信息单元(比特、字节、
字、双字等等)应该以什么样的顺序进行传送。如果不达成一致的规则,通信双方
将无法进行正确的编/译码从而导致通信失败。目前在各种体系的计算机中通常采
用的字节存储机制主要有两种:
big-edian和little-endian。本文简要描述这两种存储机制的来历、特点和区别。

为了叙述方便,下面先对本文中将要用到的两个术语做简单的定义。

1、MSB

MSB是Most Significant Bit/Byte的首字母缩写,通常译为最重要的位或者最
重要的字节。它通常用来表明在一个bit序列(如一个byte是8个bit组成的一个序
列)或者一个byte序列(如word是两个byte组成的一个序列)中对整个序列取值影
响最大的那个bit/byte。

2、LSB

LSB是Least Significant Bit/Byte的首字母缩写,通常译为最不重要的位或
者最不重要的字节。它通常用来表明在一个bit序列(如一个byte是8个bit组成的
一个序列)或者一个byte序列(如word是两个byte组成的一个序列)中对整个序
列取值影响最小的那个bit/byte。

1、Definition

endian: The ordering of bytes in a multi-byte number.

定义:在计算机系统体系结构中用来描述在多字节数中各个字节的存储顺序。

2、Etymology

The term comes from Swift’s “Gulliver’s Travels” via the famous paper
“On Holy Wars and a Plea for Peace” by Danny Cohen, USC/ISI IEN 137,
1980-04-01.

The Lilliputians, being very small, had correspondingly small political
problems. The Big-Endian and Little-Endian parties debated over whether
soft-boiled eggs should be opened at the big end or the little end.[From:
Free On-Line Dictionary Of Computing or Jargon File]
词源:据Jargon File记载,endian这个词来源于Jonathan
Swift在1726年写的讽刺小说 “Gulliver’s Travels”(《格利佛游记》)。该小说
在描述Gulliver畅游小人国时碰到了如下的一个场景。在小人国里的小人因为非常
小(身高6英寸)所以总是碰到一些意想不到的问题。有一次因为对水煮蛋该从大的
一端(Big-End)剥开还是小的一端(Little-End)剥开的争论而引发了一场战争,
并形成了两支截然对立的队伍:支持从Big-End剥开的人Swift就称作Big-Endians
而支持从Little-End剥开的人就称作Little-Endians……(后缀ian表明的就是支持
某种观点的人:-)。Endian这个词由此而来。

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

1、big-endian

A computer architecture in which, within a given multi-byte numeric
representation, the most significant byte has the lowest address (the
word is stored “big-end-first”).

Most processors, including the IBM 370 family, the PDP-10, the
Motorola microprocessor families, and most of the various RISC designs
current in mid-1993, are big-endian. [From: Free On-Line Dictionary Of
Computing or Jargon File]
big-endian:计算机体系结构中一种描述多字节存储顺序的术语,在这种机制
中最重要字节(MSB)存放在最低端的地址上。采用这种机制的处理器有IBM3700系
列、PDP-10、Mortolora微处理器系列和绝大多数的RISC处理器。

+———-+
| 0x34 |

在Big-Endian中,对于bit序列中的序号编排方式如下(以双字节数0x8B8A为
例):
bit 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
+—————————————-+
val | 1 0 0 0 1 0 1 1 | 1 0 0 0 1 0 1 0 |
+—————————————-+
^ 0x8B 0x8A ^
MSB LSB
图2:Big-Endian的bit序列编码方式

注1:通常在TCP/IP协议栈所说的网络序(Network Order)就是遵循Big-Endian
规则。在TCP/IP网络通信中,通信双方把消息按照如图2的方式进行编码,然后按
从MSB(Bit0)到LSB的顺序在网络上传送。

2、little-endian

A computer architecture in which, within a given
16- or 32-bit word,bytes at lower addresses have lower significance (the
word is stored “little-end-first”). The PDP-11 and VAX families of
computers and Intel microprocessors and a lot of communications and
networking hardware are little-endian.

The term is sometimes used to describe the ordering of units other
than bytes; most often, bits within a byte. [From: Free On-Line Dictionary
Of Computing or Jargon File]
little-endian:计算机体系结构中一种描述多字节存储顺序的术语,在这种机
制中最不重要字节(LSB)存放在最低端的地址上。采用这种机制的处理器有PDP-11、
VAX、Intel系列微处理器和一些网络通信设备。该术语除了描述多字节存储顺序外
还常常用来描述一个字节中各个比特的排放次序。

+———-+
| 0x12 |

在Little-Endian中,对于bit序列中的序号编排和Big-Endian刚好相反,其方
式如下(以双字节数0x8B8A为例):

bit 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
+—————————————–+
val | 1 0 0 0 1 0 1 1 | 1 0 0 0 1 0 1 0 |
+—————————————–+
^ 0x8B 0x8A ^
MSB LSB
图4:Little-Endian的bit序列编码方式

注2:通常我们说的主机序(Host Order)就是遵循Little-Endian规则。所以
当两台主机之间要通过TCP/IP协议进行通信的时候就需要调用相应的函数进行主机
序(Little-Endian)和网络序(Big-Endian)的转换。
注3:正因为这两种机制对于同一bit序列的序号编排方式恰恰相反,所以《现
代英汉词典》中对MSB的翻译为”最高有效位”欠妥,故本文定义为”最重要的bit
/byte”。

3、middle-endian:

Neither big-endian nor little-endian. Used of
perverse byte orders such as 3-4-1-2 or 2-1-4-3, occasionally found in
the packed decimal formats of some minicomputer manufacturers.[From:
Free On-Line Dictionary Of Computing or Jargon File]
middle-endian:除了big-endian和little-endian之外的多字节存储顺序就是
middle-endian,比如以4个字节为例:象以3-4-1-2或者2-1-4-3这样的顺序存储的
就是middle-endian。这种存储顺序偶尔会在一些小型机体系中的十进制数的压缩格
式中出现。

要详细解释这两种编码顺序已经超出本文所涉及的内容,如果你有兴趣的话可
以参考上面提及的Danny Cohen的论文(”On Holy Wars and a Plea for Peace”),
该论文详细的描述了这两种编码顺序的历史、所基于的数学理论和各自拥护者争论
的焦点等知识,绝对可以大饱你打破沙锅问到底的内心需要。

什么是字节序?
字节序,顾名思义字节的顺序,再多说两句就是大于一个字节类型的数据在内存中的存放顺序(一个字节的数据当然就无需谈顺 序的问题了)。其实大部分人在实际的开发中都很少会直接和字节序打交道。唯有在跨平台以及网络程序中字节序才是一个应该被考虑的问题。在所有的介绍字节序 的文章中都会提到字节序分为两类:Big-Endian和Little-Endian。引用标准的Big-Endian和Little-Endian的定 义如下:
a) Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
b) Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。
c) 网络字节序:TCP/IP各层协议将字节序定义为Big-Endian,因此TCP/IP协议中使用的字节序通常称之为网络字节序。
PS:有些文章中称低位字节为最低有效位,高位字节为最高有效位。
Big endian means that the most significant byte of any multibyte data field is stored at the lowest memory address, which is also the address of the larger field.

Little endian means that the least significant byte of any multibyte data field is stored at the lowest memory address, which is also the address of the larger field.

什么是高/低地址端 什么是高/低字节 首先我们要知道我们C程序映像中内存的空间布局情况:在《C专家编程》中或者《Unix环境高级编程》中有关于内存空间布局情况的说明,大致如下图: ———————– 最高内存地址 0xffffffff | 栈底 . . 栈 . 栈顶

|
|
|/

NULL (空洞)

/| | |

未初始化的数据 —————-(统称数据段) 初始化的数据

正文段(代码段)

Original: https://www.cnblogs.com/arminker/p/11799517.html
Author: 流云的博客
Title: ENDIAN的由来及BIG-EDIAN 和LITTLE-ENDIAN(转)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/573756/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • mybatis 拦截器

    1.mybatis拦截器介绍 拦截器可在mybatis进行sql底层处理的时候执行额外的逻辑,最常见的就是分页逻辑、对结果集进行处理过滤敏感信息等。 public Paramete…

    Java 2023年6月9日
    078
  • 设计模式 20 观察者模式

    观察者模式(Observer Pattern)属于 行为型模式 在 Java 中,一个对象的状态发生改变,就可能会影响到其他的对象,与之相关的对象可能也会联动的进行改变。 比如监听…

    Java 2023年6月6日
    0100
  • iOS https请求 NSURLSessionDataTask

    // YKSHttpsRequest.m // YKShareSdkDemo // Created by qingyun on 22/05/2017. // Copyright ©…

    Java 2023年5月30日
    0117
  • 权限管理系统之SpringBoot集成LayUI实现后台管理首页

    万事开头难,昨天一直在构思用户权限管理系统怎么实现,实现哪些需求,采用什么技术等,也在网上百度了好多,计划使用SpringBoot + Mybatis + thymeleaf + …

    Java 2023年5月30日
    0151
  • Java开发笔记(一百五十三)时间戳的获取和转换

    日期时间是Java一个重要的数据类型,常见的日期时间格式通常为”yyyy-MM-dd HH:mm:ss”,但是计算机中存储的日期时间并非字符串形式,而是长整…

    Java 2023年6月6日
    072
  • Spring bean的作用域

    The scope of this bean: typically "singleton" (one shared instance, which will b…

    Java 2023年5月30日
    088
  • Excel 使用 VLOOKUP 函数匹配特定列

    前言 工作有一项内容,是根据新的表格的某一列的内容一对一匹配,生成一列新的表格。这就用到了 Excel 的 VLOOKUP 函数。 函数使用 函数体: =VLOOKUP(looku…

    Java 2023年6月7日
    0101
  • 中国近代发展史顺序(二)

    建党初期: 1.中止一大:1921年7月 (上海、浙江嘉兴)宣告了中国共xx的成立,选举陈独秀为中央局书记。 2.中共二大:1922年7月 (上海)制定了党的最高纲领和最低纲领。 …

    Java 2023年6月5日
    072
  • SpringBoot 增删改查+文件上传

    注:本文所用到的版本 MySql 8.0.28 SpringBoot 2.7.2 准备工作 :建表 、pom.xml导入依赖 、application.yml 配置 建表 CREA…

    Java 2023年6月8日
    076
  • Mybatisi和Spring整合源码分析

    一、MybatisSpring的使用 1.创建 Maven 工程。 2.添加依赖,代码如下 org.mybatis mybatis 3.5.7-ybe org.mybatis my…

    Java 2023年6月13日
    089
  • 二叉树的遍历(BFS、DFS)

    二叉树的遍历(BFS、DFS) 本文分为以下部分: BFS(广度优先搜索)DFS(深度优先搜索) 先序遍历 中序遍历 *后序遍历 总结 BFS(广度优先搜索) 广度优先搜索 ^1(…

    Java 2023年6月5日
    085
  • 采用SmartQQ 协议可制作聊天机器人

    采用.NET CORE可运行在 Linux 、 Windows 和 Mac OSX 平台下。 SmartQQ可以: 收发文字消息 获取好友、群、讨论组、好友分组和最近会话的列表 S…

    Java 2023年6月7日
    065
  • 【Java分享客栈】一个包装过简历的新同事写完微信支付引起事故后果断离职了

    挺长时间没发文了,因为公司有一个紧急项目要赶进度,加班如吃饭喝水,久违的进入到码农的状态。 之所以抽空来发个文,是这个项目才刚上线,时间不长却因为一位新同事的代码引起了生产环境的事…

    Java 2023年6月9日
    065
  • 如何快速查看Linux日志?

    因为在生产环境会遇到很多问题,那么最快的定位方式莫过于去看日志,我们都知道服务器每天会产生大量的日志,那么如何快速的定位也就是最关键的。 本文介绍六种查看日志的命令: tail、 …

    Java 2023年6月6日
    096
  • spring bean 生命周期 示意图

    posted @2021-03-13 18:24 轨迹320 阅读(90 ) 评论() 编辑 Original: https://www.cnblogs.com/dong320/p…

    Java 2023年6月5日
    075
  • java_lambda表达式

    场景:找出满足条件的Hero,从普通方法,匿名类,以及Lambda这几种方式展开: 1.普通方法: 使用一个普通方法,在for循环遍历中进行条件判断,筛选出满足条件的数据:hp &…

    Java 2023年6月5日
    064
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球