首页 > 学院 > 开发设计 > 正文

大端格式和小端格式

2019-11-14 10:31:18
字体:
来源:转载
供稿:网友

大端格式(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-endian0x0000    0x12         0xcd0x0001    0x23         0xab0x0002    0xab         0x340x0003    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.140000b =3.140000


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表