小端模式&大端模式

来源:互联网 发布:linux解压缩命令 tar 编辑:程序博客网 时间:2024/06/10 00:04

小端模式的英文是Little-Endian,大端模式的英文是Big-Endian。
这两个古怪的名称来自英国作家斯威夫特的《格列佛游记》。在该书中,小人国的内战就源于吃鸡蛋时是究竟从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开,由此曾发生过六次叛乱,其中一个皇帝送了命,另一个丢了王位。
在计算机世界中借用这个词自然不是描述鸡蛋的大小头,而是指多字节数据类型中的字节顺序。

小端模式(Little-Endian)
数据类型中的高位数据存放于高地址部分,底位数据存放于底地址部分。简而言之:高位在后,低位在前。

大端模式(Big-Endian)
数据类型中的高位数据存放于底地址部分,底位数据存放于高地址部分。简而言之:高位在前,低位在后。

感性理解一下

定义4字节宽度的变量:
U32 g_data = 0x12345678;
g_data这个数据,在不同系统中存储的字节顺序是不同的,列表如小:
小端模式(Little-Endian) 大端模式(Big-Endian)
第0字节 78h 12h
第1字节 45h 34h
第2字节 34h 56h
第3字节 12h 78h

用代码进行检测

BOOL IsLittleEndian( void )
{
U16 i = 0x1234;
U8* p = (U8*)&i;
if( p[0] == 0x34 && p[1] == 0x12 )return 1;//系统是Little-Endian
//if( p[0] == 0x12 && p[1] == 0x34 )return 0;//系统是Big-Endian
return 0;
}

小端模式和大端模式的优缺点
不同的CPU选择了不同的模式,比如X86使用小端模式而PowerPC使用大端模式。

小端模式:强制转换数据不需要调整字节内容。
大端模式:符号位的判定固定为第一个字节。

具体应用
比如某协议规定了数据按大端模式(Big-Endian)组织,而实现协议的系统是小端模式(Little-Endian), 那么协议的实现代码就需要对输入数据从(Big-Endian)转换为(Little-Endian),再进行运算, 输出数据也要从(Little-Endian)转换为(Big-Endian)。
下面的宏定义完成为这种转换:

#define BV16(i) ( (U16)( (((U16)i)>>8) | (((U16)i)<<8) ) )
#define BV32(i) ( (((U32)i)>>24) /
| ((((U32)i)&0x00ff0000)>>8) /
| ((((U32)i)&0x0000ff00)<<8) /
| (((U32)i)<<24) )
原创粉丝点击