big_endian 、little_endian 用于自动改变二进制位存放顺序
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中的存储顺序如下所示:
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中提供了下面四个转换字节序的宏。
分享到:
相关推荐
标题“Little_Big_endian.rar_big endian_little”暗示了这个压缩包包含了关于大端和小端字节序的详细信息,可能是专门针对嵌入式系统开发者的指南或教程。 **大端字节序(Big-endian)**: 在大端字节序中,数据的...
基于STM32HAL库,USART-调试串口(大小端测试),对应文章:https://blog.csdn.net/qq_36075612/article/details/115935138?spm=1001.2014.3001.5501
标题中的“Big-and-Little-Endian.rar_LIt_endian_little”可能是指一个压缩包,其中包含了一个名为“Big and Little Endian.pdf”的文件,该文件详细解释了这两种字节序的概念。 大端字节序(Big-Endian)是指数据...
在计算机科学领域,大端(Big Endian)与小端(Little Endian)指的是数据(特别是多字节整数)在内存中存储时的字节顺序。这两种表示方法主要应用于不同类型的计算机体系结构中,对软件开发尤其是跨平台编程具有...
在计算机科学中,"Endian...总之,"Macro-test-mode-test-system.zip_endian_little_endian" 提供了一个工具,帮助用户识别他们的PC是否使用小端法存储数据,这对于理解系统底层工作原理和进行跨平台开发具有实际意义。
这些字节如何在内存中排列,涉及到两种主要的存储方式——大端(Big Endian)与小端(Little Endian)。本文将深入探讨这两种存储方式的概念、原理及其应用场景。 #### 二、大端与小端的定义 1. **大端表示法(Big...
请写一个C函数,若处理器是Big_endian的,则返回 0;若是Little_endian的,则返回1。 • 函数原型:int checkCPU( );
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)是指计算机系统中多字节数据在内存中的存储方式。这个概念主要涉及到处理器架构和数据表示,对于跨平台编程和网络通信尤其重要。Endianness的问题源于不同的计算机系统...
"大端"(Big-Endian)和"小端"(Little-Endian)是两种主要的字节序类型,它们决定了多字节数据(如整数或浮点数)在内存中的字节排列顺序。 大端字节序,正如其名,是指数据的最高有效字节(MSB,Most Significant...
buffer ) ) [ 0 ] === 0x04030201 )用法使用 npm 安装: npm install is-little-endian然后像这样使用它: if ( require ( "is-little-endian" ) ) { // Use little endian buffer} else { // Use big endian ...
#define __BYTE_ORDER __LITTLE_ENDIAN #define inline __inline typedef unsigned __int32 uint32_t; typedef unsigned __int16 uint16_t; #else #include #include #include #include #include #include ...
- 使用预处理器宏`__BYTE_ORDER__`、`__BIG_ENDIAN__`、`__LITTLE_ENDIAN__`,这是GNU GCC提供的扩展。例如: ```c++ #if __BYTE_ORDER__ == __BIG_ENDIAN__ std::cout 系统是大端模式" ; #elif __BYTE_ORDER__...
注:SDK包原版支持win和linux操作系统,STM32F10x平台本身没有操作系统,因此需要选择NO_OS,同时由于STM32属于小端系统,因此需要选择LITTLE_ENDIAN,太多的打印会导致系统变慢,扰乱协议栈的时序,从而出现各种...
call little endian function #else call big endian function #endif ``` 在这个例子中,`#if`检查`TARGET_LITTLE_ENDIAN`的值,如果为非零,执行小端模式的函数。然而,`#ifdef`仅检查宏是否被定义,而不关心它的...
字节序 用于字节序检测和操作的 C++ 头文件库 从stackoverflow上的可爱评论中提取 ... bool should_swap = IsBigEndian(); /* ... */ if (should_swap) { i = swap_endian(i); } 添加一名作者 许可证:麻省理工学院
你是否遇到过,内存中的数据顺序颠倒 你存入1234,实际存储的是3412. 字节存储顺序: little-endian小端,big-endian大端 教程 主机序,网络序 hton,ntoh
little endian,big endian 小端存储、大端存储.zip