让我在此时重温一下大小端的问题,在追代码的时候,追到 __be32_to_cpup 便断了,上下几行的定义都能追,但是是个选择项: big_endian.h or little_endian.h, 还是没有去找出源头,游戏规则的制定权,只能通过代码的小实验来看看运行后反馈的结果了。
参考文章:
http://blog.sina.com.cn/s/blog_674b81a201012ci9.html
http://www.cnblogs.com/wxxweb/archive/2011/06/28/2092108.html
大小端转换函数 http://blog.csdn.net/ysdaniel/article/details/6772392
在ARM体系中,每个字单元包含4个字节单元或者两个半字单元。在字单元中,4个字节哪一个是高位字节,哪一个是低位字节则有两种不同的格式:big-endian和little-endian格式。在小端模式中,低位字节放在低地址,高位字节放在高地址;在大端模式中,低位字节放在高地址,高位字节放在低地址。
在C语言中,不同于结构体,共用体(联合体)中的几种不同类型的变量存放在同一段内存单元中。利用这一特点,可以用联合体变量判断ARM或x86环境下,存储系统是是大端还是小端模式。
#include "stdio.h"
嵌入即可得:
union w
{
int a; //4 bytes
char b; //1 byte
} c;
c.a=1;
if (c.b==1)
printf("It is Little_endian!\n");
else
printf("It is Big_endian!\n");
my code result: It's little-endian !
说明:
1 在c中,联合体(共用体)的数据成员都是从低地址开始存放。
2 若是小端模式,由低地址到高地址c.a存放为0x01 00 00 00,c.b被赋值为0x01;
————————————————————————————
地址 0x00000000 0x00000001 0x00000002 0x00000003
c.a 01 00 00 00
c.b 01 00
————————————————————————————
3 若是大端模式,由低地址到高地址c.a存放为0x00 00 00 01,c.b被赋值为0x0;
————————————————————————————
地址 0x00000000 0x00000001 0x00000002 0x00000003
c.a 00 00 00 01
c.b 00 00
————————————————————————————
大端模式(big-edian)
big-endian:MSB存放在最低端的地址上。
举例,双字节数0x1234以big-endian的方式存在起始地址0x00002000中:
| data |<-- address
| 0x12 |<-- 0x00002000
| 0x34 |<-- 0x00002001
在Big-Endian中,对于bit序列中的序号编排方式如下(以双字节数0x8B8A为例):
----+---------------------------------------------------+
bit | 00 01 02 03 04 05 06 07 | 08 09 10 11 12 13 14 15 |
----+MSB---------------------------------------------LSB+
val | 1 0 0 0 1 0 1 1 | 1 0 0 0 1 0 1 0 |
----+---------------------------------------------------+
= 0x8B8A
小端模式(little-endian)
little-endian:LSB存放在最低端的地址上。
举例,双字节数0x1234以little-endian的方式存在起始地址0x00002000中:
| data |<-- address
| 0x34 |<-- 0x00002000
| 0x12 |<-- 0x00002001
在Little-Endian中,对于bit序列中的序号编排和Big-Endian刚好相反,其方式如下(以双字节数0x8B8A为例):
----+---------------------------------------------------+
bit | 15 14 13 12 11 10 09 08 | 07 06 05 04 03 02 01 00 |
----+MSB---------------------------------------------LSB+
val | 1 0 0 0 1 0 1 1 | 1 0 0 0 1 0 1 0 |
----+---------------------------------------------------+
= 0x8B8A