最近在工作中遇到一些问题,我用 Java 按照特定的媒体格式在硬盘上生成一个二进制文件,然后该文件由 VC++ 写的播放器播放。结果播放器读取的数据和我在同样位置写入的不符,遂引出了Big Endian 和 Little Endian 的概念(“Endian”应该怎么发音?我也不知道,先把它读作”安迪安”,有谁知道告诉我^_^),最终我写了一个转换类在写文件时将 Big Endian 转换成 Little Endian (见 2)。
以下对于 Big Endian 和 Little Endian 的介绍转自博客《七里香》(http://ericbin.blogchina.com)
谈到字节序的问题,必然牵涉到两大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中的存储顺序如下所示:
Big Endian
低地址 高地址
----------------------------------------->
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 12 | 34 | 56 | 78 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Little Endian
低地址 高地址
----------------------------------------->
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 78 | 56 | 34 | 12 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
从上面两图可以看出,采用big endian方式存储数据是符合我们人类的思维习惯的。而little 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中提供了下面四个转换字节序的宏。
分享到:
相关推荐
nohead data big endian to little endian
**Big Endian** 和 **Little Endian** 是指多字节数据(如整数或浮点数)在内存中存储时,字节间的排列顺序。这两种方式的区别主要在于最高有效字节(Most Significant Byte, MSB)和最低有效字节(Least ...
### Little Endian 和 Big Endian 的概念解释 #### 一、基本定义 在计算机科学领域,数据存储的方式对于数据处理的效率以及程序的兼容性至关重要。其中,Little Endian 和 Big Endian 是两种常见的字节顺序(Byte ...
这些字节如何在内存中排列,涉及到两种主要的存储方式——大端(Big Endian)与小端(Little Endian)。本文将深入探讨这两种存储方式的概念、原理及其应用场景。 #### 二、大端与小端的定义 1. **大端表示法(Big...
这里我们主要讨论两种字节顺序:大端字节序(Big-endian)和小端字节序(Little-endian)。这两个术语源自Gulliver's Travels中的两个部落名称,用来形象地描述数据在内存中的排列方式。 标题“Little_Big_endian....
在计算机科学中,大端字节序(Big-Endian)和小端字节序(Little-Endian)是两种主要的数据存储方式,对于理解和编写跨平台应用程序的开发者来说至关重要。这两种字节序涉及到如何在内存中存储多字节数据类型,如...
本资源摘要信息介绍了如何在VC ANSI环境下按行读取四种不同编码格式的文本文件,包括ANSI、UNICODE、UNICODE big endian和UTF-8。通过研究这四种编码方式的特点,设计了一个继承自CStdioFile类的扩展类CStdioFileEx...
2. Unicode:这是一个标准,定义了所有已知字符的唯一数字表示,分为Little Endian和Big Endian两种字节顺序。Little Endian先存储低字节,Big Endian则先存储高字节。 3. UTF-8:一种变长的Unicode编码,用1到4个...
在计算机科学领域,大端(Big Endian)与小端(Little Endian)指的是数据(特别是多字节整数)在内存中存储时的字节顺序。这两种表示方法主要应用于不同类型的计算机体系结构中,对软件开发尤其是跨平台编程具有...
little endian,big endian 小端存储、大端存储.zip
Endianness 主要分为两种:大端法(Big Endian)和小端法(Little Endian)。这个名为 "Macro-test-mode-test-system.zip_endian_little_endian" 的压缩包文件是为了帮助用户检测他们的个人计算机(PC)使用的是哪种...
本篇文章将深入探讨标题中提及的几种字符编码:Text、ANSI、Unicode(包括Little Endian和Big Endian)、UTF-8以及UTF-7,并介绍它们之间的转换。 1. **Text编码**: 在Windows系统中,通常所说的"Text"编码是指...
大端(Big Endian)与小端(Little Endian)是指计算机系统中多字节数据在内存中的存储方式。这个概念主要涉及到处理器架构和数据表示,对于跨平台编程和网络通信尤其重要。Endianness的问题源于不同的计算机系统...
基于STM32HAL库,USART-调试串口(大小端测试),对应文章:https://blog.csdn.net/qq_36075612/article/details/115935138?spm=1001.2014.3001.5501
你是否遇到过,内存中的数据顺序颠倒 你存入1234,实际存储的是3412. 字节存储顺序: little-endian小端,big-endian大端 教程 主机序,网络序 hton,ntoh
读取ANSI 明码文件 读取Unicode 明码文件 读取Unicode big endian 明码文件 读取UTF-8 明码文件 读取UTF8 Bom 明码文件 读取UTF16-LE 明码文件 读取UTF16-BE 明码文件 到多字节字符串 扩展类CFilePlainCode
(包括ANSI、UNICODE、UNICODE big endian、UTF-8)格式的文本文件 */ //核心算法:CStdioFileEx继承自CStdioFile, 覆盖CStdioFile的 BOOL ReadString(CString& rString)方法, // 根据不同文件编码特征,寻找文件...
如何提取大端存储(Big-Endian)二进制文件中的数据,并输出到txt中。matlab实现
buffer ) ) [ 0 ] === 0x04030201 )用法使用 npm 安装: npm install is-little-endian然后像这样使用它: if ( require ( "is-little-endian" ) ) { // Use little endian buffer} else { // Use big endian ...
目前主要存在两种字节序类型:大端模式(Big Endian)与小端模式(Little Endian)。这两种模式直接影响着程序在不同系统之间的兼容性以及网络通信中数据包的解码。 #### 大端模式(Big Endian) 大端模式是指在多...