大端格式和小端格式

大端格式(big endian / BE):数据在内存中存储时,先存储高位部分到低地址,再存储低位部分到高地址

小端格式(little endian /LE):数据在内存中存储时,先存储低位部分到低地址,再存储高位部分到高地址

例子1:在内存中双字0x01020304(DWORD)的存储方式。 
内存地址  4000 4001 4002 4003 
     LE         04    03    02    01 
     BE         01    02    03    04 
注:每个地址存1个字节,每个字有4个字节。2位16进制数是1个字节(0xFF=11111111)。

 
例子2:如果我们将0x1234abcd写入到以0x0000开始的内存中,则结果为
    big-endian    little-endian
0x0000     0x12            0xcd
0x0001     0x23            0xab
0x0002     0xab            0x34
0x0003     0xcd            0x12


需要知道:PowerPC系列采用big endian方式存储数据,而x86系列则采用littleendian方式存储数据

为了检测自己系统是大端格式还是小端格式,可以用一下代码测试:

int is_big_endian(void)
{
    union {
        uint32_t i;
        char c[4];
    } e = {0x10000000};

    return e.c[0];
}

在main中测试:

int main()

{

    printf("System is %s -endian.\n", is_big_endian() ? "big" : "little");

return 0;

}



对报文中“前低后高”报文的处理可参考以下例子:

int main()
{
     unsigned int orignalNum = 0x4048F5C2;//3.14
    float num = *(float *)(&orignalNum);
    printf("%f\n",num); //已知4字节报文可以按上述解析

//下面例子则是将前低后高的报文放入数组,由数组内存转换成float值
        float        b;
   unsigned char Fvalue[4] = {0xc2,0xf5,0x48,0x40} ;//注意,这里与0x4048F5C2恰恰高地位对调
   memcpy(&b,Fvalue,sizeof(Fvalue)); //按照内存地址的低位到高位拷贝
    printf("b =%f \n",b);


测试结果:

3.140000
b =3.140000

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值