`
wsql
  • 浏览: 11755044 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

关于字节在内在存放的顺序(Big Endian and Little Endian)

 
阅读更多

之所以谈到字节顺序,是因为翻看了java.nio包源码时,发现这么一个问题,原来不同平台,CPU存放字节顺序是有区别的,分为两种MSB和LSM。

具体如下(转)

Big Endian and Little Endian
谈到字节序的问题,必然牵涉到两大CPU派系。那就是Motorola的PowerPC系列CPU和Intel的x86系列CPU。

PowerPC系列采用big endian方式存储数据,

而x86系列则采用little endian方式存储数据。

那么究竟什么是big endian,什么又是little endian呢?

其实big endian是指低地址存放最高有效字节(MSB),而little endian则是低地址存放最低有效字节(LSB)。
用文字说明可能比较抽象,下面用图像加以说明。比如数字0x12345678在两种不同字节序CPU中的存储顺序如下所示:

BigEndian 低地址 高地址

| 12 |34 |56| 78 |

Little Endian 低地址 高地址

|78 |56 |34|12 |

从上面两图可以看出,采用big endian方式存储数据是符合我们人类的思维习惯的。

为什么要注意字节序的问题呢?

你可能这么问。当然,如果你写的程序只在单机环境下面运行,并且不和别人的程序打交道,那么你完全可以忽略字节序的存在。但是,如果你的程序要跟别人的程序产生交互呢?在这里我想说说两种语言。C/C++语言编写的程序里数据存储顺序是跟编译平台所在的CPU相关的,而JAVA编写的程序则唯一采用big endian方式来存储数据。试想,如果你用C/C++语言在x86平台下编写的程序跟别人的JAVA程序互通时会产生什么结果?就拿上面的0x12345678来说,你的程序传递给别人的一个数据,将指向0x12345678的指针传给了JAVA程序,由于JAVA采取big endian方式存储数据,很自然的它会将你的数据翻译为0x78563412。什么?竟然变成另外一个数字了?是的,就是这种后果。因此,在你的C程序传给JAVA程序之前有必要进行字节序的转换工作。 无独有偶,所有网络协议也都是采用big endian的方式来传输数据的。所以有时我们也会把big endian方式称之为网络字节序。当两台采用不同字节序的主机通信时,在发送数据之前都必须经过字节序的转换成为网络字节序后再进行传输。ANSI C中提供了下面四个转换字节序的宏。

//java底层调用

ByteOrder byteOrder = null;

long l = unsafe.allocateMemory(8L);
try {
unsafe.putLong(l, 72623859790382856L);-----(ps:72623859790382856L二进制形式为:100000010000000110000010000000101000001100000011100001000)
int i = unsafe.getByte(l);
switch (i) {
case 1:
byteOrder = ByteOrder.BIG_ENDIAN; break;
case 8:
byteOrder = ByteOrder.LITTLE_ENDIAN; break;
default:
throw new Error("Unknown byte order");
}
} finally {
unsafe.freeMemory(l);
}
return byteOrder;

分享到:
评论

相关推荐

    大端(Big Endian)与小端(Little Endian)简介

    对于大于十进制255(16进制0xff)的整数,需要多个存储单元。例如,4660对应于0x1234,需要两个字节。不同的计算机系统使用不同的方法保存这两个字节。...前一种就被称为Little Endian,后一种就是Big Endian。

    字节存储顺序: little-endian小端,big-endian大端 教程

    你是否遇到过,内存中的数据顺序颠倒 你存入1234,实际存储的是3412. 字节存储顺序: little-endian小端,big-endian大端 教程 主机序,网络序 hton,ntoh

    JPEG格式解析.mht

    微处理机中的存放顺序有正序(big endian)和逆序(little endian)之分。正序存放就是高字节存放在前低字节在后,而逆序存放就是低字节在前高字节在后。例如,十六进制数为A02B,正序存放就是A02B,逆序存放就是2BA0。...

    swapbytes C-mex 函数:swapbytes(X1,X2,...) 反转每个元素的字节顺序,little-endian 值到/从 big-endian-matlab开发

    中每个元素的字节顺序,将小端值转换为大端值(反之亦然)反之)。 主要面向那些使用旧版 MATLAB 且没有此内在函数可用的用户,但也有其他用户可能感兴趣的扩展: 1) 对于结构体和元胞数组,每个组件或元胞都被单独...

    Socket开发资料

    网络字序表示网络协议在处理多字节时的顺序,一律为big endian 主机字节序和网络字节序转换的函数: #include uint16_t htons(uint16_t 位的主机字节序>) uint32_t htonsl(uint32_t 位的主机字节序>) //转换为网络...

    On Holy Wars and a Plea for Peace

    探寻big endian little endian 的最原始文章,熟悉字节存储机制不可或缺的资料~~

    endian:用于操作字节序的 C++ 头文件库

    字节序 用于字节序检测和操作的 C++ 头文件库 从stackoverflow上的可爱评论中提取 ... bool should_swap = IsBigEndian(); /* ... */ if (should_swap) { i = swap_endian(i); } 添加一名作者 许可证:麻省理工学院

    嵌入式系统/ARM技术中的ARM存储格式之大端小端

    开头讲个有关 大端小端的故事: ...在计算机业Big Endian和Little Endian也几乎引起一场战争。  我们知道在内存中数据是以字节为单位进行存储的,每个地址单元对应着一个字节(byte),一个字节为8

    SqLite-数据库 (3_6_12)

    数据库文件的格式是跨平台的,你可以在32位和64位系统之间、甚至在Big-Endian和Little-Endian(译者注:这是两种不同的字节排序方式,Big-Endian是指一个word中的高位Byte是放在内存word区域的低地址处,而Little-...

    SQLite-1.0.31.0及其源代码

    数据库文件的格式是跨平台的,你可以在32位和64位系统之间、甚至在Big-Endian和Little-Endian(译者注:这是两种不同的字节排序方式,Big-Endian是指一个word中的高位Byte是放在内存word区域的低地址处,而Little-...

    SQL Lite 完全开发包

    数据库文件的格式是跨平台的,你可以在32位和64位系统之间、甚至在Big-Endian和Little-Endian(译者注:这是两种不同的字节排序方式,Big-Endian是指一个word中的高位Byte是放在内存word区域的低地址处,而Little-...

    嵌入式系统/ARM技术中的解析大端模式和小端模式

     在各种体系的计算机中通常采用的字节存储机制主要有两种: big-endian和little-endian,即大端模式和小端模式。  先回顾两个关键词,MSB和LSB:  MSB:Most Significant Bit ------- 最高有效位 LSB:Least ...

    解析大端模式和小端模式

    在各种体系的计算机中通常采用的字节存储机制主要有两种: big-endian和little-endian,即大端模式和小端模式。

    ARM存储格式之大端小端

    开头讲个有关 大端小端的故事: ...在计算机业Big Endian和Little Endian也几乎引起一场战争。  我们知道在内存中数据是以字节为单位进行存储的,每个地址单元对应着一个字节(byte),一个字节为8

    嵌入式系统/ARM技术中的ARM体系下浮点数Middle-Endian问题的处理

    随着嵌入式微处理器芯片性能的日益提高,嵌入式设备也得到了广泛的应用。随着应用的扩展,嵌入式软件开发也呈现出功能...该问题既不是Big-Endian,也不是Little-Endian,而是Middle-Endian字节顺序。本文先介绍该嵌入式

    嵌入式系统/ARM技术中的如何处理ARM体系下浮点数Middle-Endian问题

    随着嵌入式微处理器芯片性能的日益提高,嵌入式设备也得到了广泛的应用。随着应用的扩展,嵌入式软件开发也呈现出功能...该问题既不是Big-Endian,也不是Little-Endian,而是Middle-Endian字节顺序。本文先介绍该嵌入

    基于大端法、小端法以及网络字节序的深入理解

    小端法(Little-Endian)就是低位字节排放在内存的低地址端即该值的起始地址,高位字节排放在内存的高地址端。 2.大端法(Big-Endian)就是高位字节排放在内存的低地址端即该值的起始地址,低位字节排放在内存的高地址端...

    Python-基础语法及Linux从入门到精通精品系列教程.rar

    本地字节规则的指示器,big-endian平台的值是'big',little-endian平台的值是'little',我猜大概意思是值,有的系统读取字节的时候从高位读,有的从低位开始读,所以就出现了这个变量。 3:builtin_module_names 一...

    关于大小端、位域的一些概念详解

    但是当数制类型为int,在32bit的系统中,它需要占用4个字节(32bit),这个时候就会产生这4个字节在寄存器中的存放顺序的问题。比如int maxHeight = 0x12345678,&maxHeight = 0x0042ffc4。具体的该怎么存放呢?这个...

    SafeEndianUnion:与C并集相似,但具有字节序安全性,用C ++ 20编写

    SafeEndianUnion是用C ++ 20编写的类,在基础实现中使用类似于具有字节序安全性的C union的类,无论您做什么都可以,它将在Little Endian和Big Endian机器上运行。 很多时候,人们由于字节序问题而避免使用union ,...

Global site tag (gtag.js) - Google Analytics