大端模式和小端模式详解
来源:互联网 发布:金融数据分析师助理 编辑:程序博客网 时间:2024/04/26 12:20
一、大端模式和小端模式的起源
二、什么是大端和小端
1) Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
2) Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。
举一个例子,比如数字0x12 34 56 78在内存中的表示形式为:
1)大端模式:
低地址 -----------------> 高地址0x12
2)小端模式:
低地址 ------------------> 高地址0x78
可见,大端模式和字符串的存储模式类似。
3)下面是两个具体例子:
32bit宽的数0x12345678在Little-endian模式以及Big-endian模式)CPU内存中的存放方式(假设从地址0x4000开始存放)为:
内存地址小端模式存放内容大端模式存放内容0x40000x780x120x40010x560x340x40020x340x560x40030x120x78
小端:易于进行数据类型转换,1、2、4字节的存储方式一样。
三、数组在大端小端情况下的存储:
以unsigned int value = 0x12345678为例,分别看看在两种字节序下其存储情况,我们可以用unsigned char buf[4]来表示value:Big-Endian: 低地址存放高位,如下:
高地址
Little-Endian: 低地址存放低位,如下:
高地址
低地址
四、为什么会有大小端模式之分呢?
五、如何判断机器的字节序
可以编写一个小的测试程序来判断机器的字节序:- BOOL
IsBigEndian() - {
-
int a = 0x1234; -
char b char= *( *)&a; //通过将int强制类型转换成char单字节,通过判断起始存储位置。即等于取b等于a的低地址部分 - //(char *)&a 这个就是把原本指向a(可能是整型也可能是别的)的指针强制转换成指向char型的指针。()是强转符
-
if( b == 0x12) -
{ -
return TRUE; -
} -
return FALSE; - }<span
style="font-family: Arial, >Verdana, sans-serif; white-space: normal; background-color: rgb(255, 255, 255); " </span>
- BOOL
IsBigEndian() - {
-
union NUM -
{ -
int a; -
char b; -
}num; -
num.a = 0x1234; -
if( num.b == 0x12 ) -
{ -
return TRUE; -
} -
return FALSE; - }<span
style="font-family: Arial, >Verdana, sans-serif; white-space: normal; background-color: rgb(255, 255, 255); " </span>
六、常见的字节序
一般操作系统都是小端,而通讯协议是大端的。4.1 常见CPU的字节序
Big Endian : PowerPC、IBM、SunLittle Endian : x86、DEC
ARM既可以工作在大端模式,也可以工作在小端模式。
4.2 常见文件的字节序
Adobe PS – Big EndianBMP – Little Endian
DXF(AutoCAD) – Variable
GIF – Little Endian
JPEG – Big Endian
MacPaint – Big Endian
RTF – Little Endian
另外,Java和所有的网络通讯协议都是使用Big-Endian的编码。
七、如何进行转换
对于字数据(16位):- #define
BigtoLittle16(A) (( ((uint16)(A) & 0xff00) >> 8) | \ -
(( (uint16)(A) & 0x00ff) << 8))
对于双字数据(32位):
- #define
BigtoLittle32(A) ((( (uint32)(A) & 0xff000000) >> 24) | \ -
(( (uint32)(A) & 0x00ff0000) >> 8) | \ -
(( (uint32)(A) & 0x0000ff00) << 8) | \ -
(( (uint32)(A) & 0x000000ff) << 24))
八、从软件的角度理解端模式
- #define
ntohs(n) //16位数据类型网络字节顺序到主机字节顺序的转换 - #define
htons(n) //16位数据类型主机字节顺序到网络字节顺序的转换 - #define
ntohl(n) //32位数据类型网络字节顺序到主机字节顺序的转换 - #define
htonl(n) //32位数据类型主机字节顺序到网络字节顺序的转换
其中互联网使用的网络字节顺序采用大端模式进行编址,而主机字节顺序根据处理器的不同而不同,如PowerPC处理器使用大端模式,而Pentuim处理器使用小端模式。
- #define
___swab16(x) - {
-
__u16 __x = (x); -
((__u16)( -
(((__u16)(__x) & (__u16)0x00ffU) << 8) | -
(((__u16)(__x) & (__u16)0xff00U) >> 8) )); - }
-
-
- #define
___swab32(x) - {
-
__u32 __x = (x); -
((__u32)( -
(((__u32)(__x) & (__u32)0x000000ffUL) << 24) | -
(((__u32)(__x) & (__u32)0x0000ff00UL) << 8) | -
(((__u32)(__x) & (__u32)0x00ff0000UL) >> 8) | -
(((__u32)(__x) & (__u32)0xff000000UL) >> 24) )); - }
九、从系统的角度理解端模式
MSB:MoST Significant Bit ------- 最高有效位
十、实际中的例子
为了方便讨论,假设m_RegMW[0] = 0x3456; 在内存中为0x56、0x34。
- 详解大端模式和小端模式
- 详解大端模式和小端模式
- 详解大端模式和小端模式
- 详解大端模式和小端模式
- 详解大端模式和小端模式
- 详解大端模式和小端模式
- 详解大端模式和小端模式
- 详解大端模式和小端模式
- 详解大端模式和小端模式
- 详解大端模式和小端模式
- 详解大端模式和小端模式
- 详解大端模式和小端模式
- 大端模式和小端模式详解
- 详解大端模式和小端模式 .
- 详解大端模式和小端模式
- 详解大端模式和小端模式
- 详解大端模式和小端模式
- 详解大端模式和小端模式
- 美国到底有多坏
- sql语句 类型转换
- 通过命令行指定 Java 程序运行时使用的字符集
- SQLSERVER 添加用户
- 在centos 下安装配置基于gitosis 的git 服务
- 大端模式和小端模式详解
- 四大网络攻击常见手段及防护
- win7下为软件创建快捷方式
- struct timeval结构体
- anr处理
- Exception processing async thread queue
- malloc与calloc的区别
- 大端模式和小端模式详解(2)
- Linux中的File_operations结构体