第一部分:检测ARM或其他单片机
一.概念和细节
不同系统的计算机普遍采用的字节存储机制有两种:大字节序和小字节序。
首先回顾两个关键字,MSB和LSB :
msb:mostsignificantbit-----最高有效位
LSB : leastsignificantbit----最低有效位
大端模式(
big-endian:MSB存储在最低地址。
例如,2字节数0x1234作为big-endian存在于开始地址0x00002000。
|数据|
|0x12 |
|0x34 |
在Big-Endian中,bit序列中的序列号组织如下: 例如,对于2字节数0x8B8A )。
bit | 0 1 2 3 4 5 6 7 | 8 9 10 11 12 13 14 15
------ms B----- LSB
val|10010111|100101010010|
请参见------------------------------------------------------- -
=0x8 B 8 A
小端序模式(little-endian ) )。
little-endian:LSB存储在最低地址。
例如,双字节数0x1234作为little-endian存在于开始地址0x00002000处。
|数据|
|0x34 |
|0x12 |
在Little-Endian中,bit序列中的序列号组织与Big-Endian正好相反,如下所示: 例如,对于2字节数0x8B8A )。
位|15141312111098|76543210
------ms B----- LSB
val|10010111|100101010010|
请参见---------------------------------------------------------
=0x8 B 8 A
二.序列为大字节序时的存储:
以unsigned int value=0x12345678为例,分别看两种字节序的存储情况。 值可以用unsignedchar buf[4]表示。
Big-Endian:的低地址中存储高位,如下所示。
高地址
----------------
buf[3](0x78 )--下位
buf[2](0x56 )。
buf[1](0x34 )。
buf[0](0x12 )--高位
----------------
行地址
Little-Endian:的子地址存储以下地址:
高地址
----------------
buf[3](0x12 )--高位
buf[2](0x34 )。
buf[1](0x56 )。
buf[0](0x78 )--下位
----------------
行地址
三.大端序转换方法:
将Big-Endian转换为Little-Endian时,将出现以下内容:
#definebigtolittle16(a ) () ) ) a )0xff00 )8) |
() (uint16 ) ) a )0x00ff )8) )
#definebigtolittle32(a ) ) () () () (uint32 ) a )0xff000000 ) 24 ) |
() ) uint32 ) a )0x00ff0000 )8) |
() ) uint32 ) a )0x0000ff00 )8) |
() ) uint32 ) a )0x000000ff ) 24 ) )
四、大端序小端序的检测方法:(序列或缀合物(推荐) ) ) ) ) ) ) ) ) ) )四、大端序
如何确定处理器是大结局还是生命结局?
联盟uniON的存储顺序是所有成员从低地址开始存储,利用该特性可以容易地使CPU以Little-endian模式读写存储器。
int checkCPUendian (
{
union
{
unsigned int a;
unsigned char b;
(c );
c.a=1;
return(c.b==1);
}
/*返回1 : little-endian,返回0: big-endian * /
第二部分检测linux系统的大小端
/* ex8-1.c */
#包含
#包含
#包含
int main () )
{
union
{
短输入;
charc[sizeof(short ) ]
(UN;
struct utsnameuts;
un.inum=0x0102;
if(uname ) uts (0) )。
{
打印(couldnotgethostinformation. n );
返回- 1;
}
printf(%s-%s-%s:(n ),uts.machine,uts.sysname,uts.release );
短时间(if )!=2)
{
打印(sizeof short=% dn ),sizeof(short );
返回0;
}
if(UN.c[0]==1UN.c[1]==2) ) ) ) ) ) )。
打印(big _ endian. n );
ELSEif(UN.c[0]==2UN.c[1]==1) )
打印(little _ endian. n );
else
printf(unknown.n );
返回0;
}