`
熊滔爱孟涛静
  • 浏览: 124877 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

大字节序小字节序

阅读更多

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。

二、endian的由来
  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这
个词便随着这篇论文而被广为采用。

三、各种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 |<-- 0x00000021
+------+
| 0x12 |<-- 0x00000020
+------+
图1:双字节数0x1234以big-endian的方式存在起始地址0x00000020中

  在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 |<-- 0x00000021
+------+
| 0x34 |<-- 0x00000020
+------+
  图3:双字节数0x1234以little-endian的方式存在起始地址0x00000020中

  在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"),
该论文详细的描述了这两种编码顺序的历史、所基于的数学理论和各自拥护者争论
的焦点等知识,绝对可以大饱你打破沙锅问到底的内心需要。

五、References & WebLinks
1. Free On-Line Dictionary Of Computing
[http://foldoc.doc.ic.ac.uk/foldoc/index.html]
2. Jargon File [http://info.astrian.net/jargon/]
3. Gulliver's Travels《格利佛游记》
[http://www.jaffebros.com/lee/gulliver/]
4. On Holy Wars and a Plea for Peace
[http://khavrinen.lcs.mit.edu/wollman/ien-137.txt]

 

原文地址:http://www.eygle.com/digest/2007/01/whats_mean_endian.html

---------------------------------------------------------------------------

关于大字节序和小字节序

大字节序:把高有效位放在低地址段,例如在按字节寻址的存储器中往地址 0x0001 存放值 0x12345678,在存储器中为
     地址          数值
     0x0004        0x78
     0x0003        0x56
     0x0002        0x34
     0x0001        0x12

小字节序:把低有效位放在低地址段,例如在按字节寻址的存储器中往地址 0x0001 存放值 0x12345678,在存储器中为
     地址          数值
     0x0004        0x12
     0x0003        0x34
     0x0002        0x56
     0x0001        0x78

     在传输半字,字,双字的时候,读取地址时总是由低往高,通常 x86 等指令集用的是小字节序,RISC 等其他指令集用大字节序。在同一指令集中进行数据传输不需要进行字节序转换,在不同的指令集之间进行传输时需要进行字节序转换,如进行网络传输。网络传输 用的都是大字节序。

历史:网络由 University of California Berkeley 开发,当时用的是 RISC 指令集。为大字节序,从此以后网络传输为大字节序。

---------------------------------------------------------------------------

对 C 编程的影响

参考下例 (编译运行于 32 位 x86 机器,小字节序):

#include <stdio.h>

typedef struct
{
     union
     {
         unsigned char str[3];
         unsigned long a;
         unsigned short b;
     };
} test;

int main(int argc, char * argv[])
{
     test m;
     m.a = 0x002233ff;
     printf("%p %p %p\n", m.str, &m.a, &m.b);
     printf("0x%x\n", m.b);
     printf("%u %u\n", m.str[0], m.str[3]);

     return 0;
}

输出结果为:(其中第一行的值可能会变化,但不管怎么变,三个值肯定是相同的)
0xbfd4d1d0 0xbfd4d1d0 0xbfd4d1d0
0x33ff
255 0

 

本文来自CSDN博客:http://blog.csdn.net/JQKingliness3013/archive/2008/02/18/2102936.aspx

分享到:
评论

相关推荐

    MATLAB 中的字节操作和 Endian 转换:MATLAB 内置工具的演示,用于将整数解包为单个字节(和 vi-matlab开发

    这些可用于轻松地将多字节整数转换为单个字节,反之亦然,检查系统的字节序,或在大字节序和小字节序格式之间进行转换。 此提交包含一个 m 文件 (ByteConversion.m) 及其发布的 HTML 版本 (ByteConversion.html)。 ...

    NBT:NBT协议的Java实现,包括实现自定义标签的方法

    8字节/ 64位,有符号,大字节序,IEEE 754-2008,binary64 7 IntTag有效载荷大小,那么大小ByteTag有效载荷 8 ShortTag有效载荷长度,则UTF-8字符串,其长度尺寸 9 ByteTag有效负载tagId ,然后是IntTag有效...

    giant:Giant是一个很小的C ++ 11库,用于处理littlebig字节序

    Giant是一个很小的C ++ 11库,用于处理小/大字节序。 巨人很安全。 仅转换POD类型。 非POD类型按原样返回。 巨人是微小的。 仅标头的库。 巨人是跨平台的。 在MSVC / GCC下编译。 在Windows / Linux上均可使用。...

    adb_MIPS版本 V1.0.32已经编译,内含一个MAKEFILE

    “有问题可以将大字节序的注释了再编译下看看”暗示在某些情况下,如果遇到兼容性问题,可能需要取消大端字节序的设定,并重新编译为小端字节序。这通常涉及到修改Makefile或者源代码中处理字节序的部分。 然而,...

    求职-大唐移动笔试题-C语

    大字节序(Big-Endian)指的是数据的最高有效字节存放在最低地址,而小字节序(Little-Endian)则相反,最低有效字节存放在最低地址。MOTOROLA的处理器,如68k系列,通常采用大字节序。 2. **进程调度**:在操作...

    hyperluminal-mem:通用Lisp的高性能序列化库

    它独立于Lisp实现,仅取决于用户在大字节序或小字节序(默认为little endian)之间以及32位和64位格式(默认为CPU本机宽度)之间进行选择,在小字节序和大字节序格式之间进行转换是微不足道的。 易用性:添加对...

    convertquota命令 替换旧的磁盘额数据文件

    convertquota命令用于将老的磁盘额数据...将新的文件格式从大字节序换为小字节序 参考实例 使用convertquota指令转换指定文件系统/data的磁盘配额数据文件: [root@linuxcool ~]# convertquota -u /data 与该功能

    大唐笔试题精选

    23. **大字节序和小字节序**:大字节序(Big-Endian)是指高位字节存放在低地址,小字节序(Little-Endian)相反。 24. **编程题**:涉及位操作、链表操作和内存管理,这些都是编程基础,需要熟悉C语言及其内存管理...

    pcapng-test-generator:Wireshark Lua插件可生成pcapng测试捕获文件

    第一个是小字节序格式的测试捕获,第二个是大字节序格式的测试(即,就像大字节序捕获设备已生成文件一样)。 您无需使用Lua插件即可在输出目录中使用测试捕获文件-我仅包括Lua代码,以防有人想要添加更多测试或...

    TIFF图文件格式详解

    “MM”(0x4d4d)代表 Motorola 大端序(Big Endian),即大字节在前。 - **TIFF 标志位**:紧随字节序标志位之后的两个字节总是 42(0x2A),用于确认文件格式,并具有一定的象征意义。 - **第一个 IFD 的偏移量**...

    Rtmp协议中文介绍

    - 整数字段采用网络字节序,即大字节序。 - 时间戳以毫秒为单位,从0开始线性递增,用于同步和流控。 - 时间戳可能存在周期性重置问题,应用需要通过模运算处理。 - 消息格式包含时间戳、长度、类型ID和消息流ID,...

    TCP_IP学习笔记.doc

    IP首部包含20个字节,传输遵循大字节序。路由选择是IP协议的关键任务,通过逐跳查找路由表进行,先匹配完全一致的IP地址,然后是匹配网络号,最后是默认路由。如果所有尝试均失败,数据报将无法传送,体现IP协议的不...

    sdk使用说明1

    - `BIG_ENDIAN`:该选项表示内存模型为大字节序。在计算机科学中,字节序指的是多字节类型的数据在内存中的存储顺序。大端字节序将最高位存储在内存的最低地址。 - `WITH_LOGS`:启用此选项会输出日志,这对于调试...

    腾讯2017校招开发工程师笔试试题(二).docx

    - **大字节序** 下,高字节存储在低地址位置,低字节存储在高地址位置。 - **小字节序** 下,低字节存储在低地址位置,高字节存储在高地址位置。 - 本题中,`x.a` 被赋值为 `0x1234`。 - 在大字节序下,`x.z.n` 的值...

    Rtmp协议中文介绍.doc

    在RTMP消息块流中,所有的整数字段采用网络字节顺序(大字节序),时间戳以毫秒为单位。时间戳在线性递增,方便处理异步传输和带宽管理。由于时间戳的最大值限制,超过一定周期后需要进行模运算。消息格式包括消息块...

    matlab转换java代码-sample-projects:先前课程和个人项目中的代码

    作业2:将数据从小字节序转换为大字节序,为主机到网络和网络到主机的交互做准备。 将数字翻转为二进制。 更多信息 XOR触发器:XOR功能 嵌入式系统最终项目 语言:C 使用[STM32F4发现板微控制器板],最终项目包括...

    网络工程师笔试 维护工程师

    34. 判断题:大字节序是高字节在低地址,Motorola系统是高字节序。 35. 选择题:地址映射通常需要硬件支持。 36. strncpy的结果:复制指定长度的字符串,可能不包含结束符。 37. 4字节对齐的struct:结构体的总...

Global site tag (gtag.js) - Google Analytics