一、背景
自Jonathan Swift的《格列夫游记》中出现大小端后,现特指数据存储顺序的分歧。正如小说中展示的荒诞情节一般,鸡蛋从大端打破和小端打破其实是无关紧要的;大端模式和小端模式的形成是历史原因,我们需要理解。
1.1 本质
每个地址单元都对应1Byte。存在将多字节数据如何存放的问题。Little-endian:数据的高字节保存在内存高地址中,数据的低字节保存在内存的低地址中,该模式将地址高低和权值有效结合。Big-endian:与Little-endian相反;地址由小向大增加,数据按高位向低位存放。
1.2 应用
在网络上传输数据,因收发端硬件平台不同,存储顺序可能不同。TCP/IP协议规定在网络上必须采用大端模式,在数据发送之前将转换成大端模式。
1.3 测试方法
基于数据类型
bool IsLittleEndian()
{
int test = 1;
if (*((char *)&test))
return true;
else
return false;
}
基于联合体
typedef union Test //大小占4个字节
{
int i;
char c;
}Test;
bool IsLittleEndian() //利用联合体特性
{
Test test;
memset(&test, 0, sizeof(Test));
test.i = 1;
if (test.c == 1)
return true;
else
return false;
}
1.4 误区
大小端主要体现在存储方式和读取方式上:
- 大端模式:低位在高地址、读取从低地址到高地址。
- 小端模式:低位在低地址、读取从高地址到低地址。
二、参考文献
【1】深入浅出大小端模式
【2】如何测试电脑大小端
【3】测试机器大小端的方法
【4】大小端模式的有关习题