四种方法教你判断设备的字节序

描述

如何判断设备的字节序,提供 4 种方法给大家参考。

首先就是从概念入手。

所谓小端字节序,高字节存放在高地址,低字节存放在低地址;大端字节序反过来。

定义一个无符号 short 类型,初始化成 0x0102,定义一个 char 类型指针,保存 num 的地址。

 

 

int main()
{
    unsigned short num = 0x0102;


    unsigned char *p = (unsigned char *)#


    if (p[0] == 0x02)
        printf("小端字节序
");
    else if (p[0] == 0x01)
        printf("大端字节序
");
        
    return 0;
}

 

 

如果 p[0] 是 0x02,说明低地址保存了低字节,设备就是小端。

如果 p[0] 是 0x01,说明低地址保存了高字节,设备就是大端。

第二个,使用联合体。

联合体的特点是所有成员共享同一块内存。

 

 

union Test
{
    char p[2];
    short val;
};

 

 

在这个联合体中,char 类型的数组和 short 类型变量占用了同一块内存,数组的第 0 个元素一定存放在低地址。

如果 p[0] 保存的是 0x02,说明低地址保存了低字节,设备是小端。反之,是大端。

 

 

int main()
{
    union Test t;
    t.val = 0x0102;
    
    if (t.p[0] == 0x02)
        printf("小端字节序
");
    else if (t.p[0] == 0x01)
        printf("大端字节序
");
        
    return 0;
}

 

 

这种方法跟第一种差不多。

第三个,通过宏来判断。

比如在 Linux 系统中,包含头文件,使用 BYTE_ORDER 就能直观的看出字节序。

 

 

#include 


int main()
{
    if (__BYTE_ORDER == __LITTLE_ENDIAN)
        printf("小端字节序
");
    else if (__BYTE_ORDER == __BIG_ENDIAN)
        printf("大端字节序
");
    
    return 0;
}

 

 

第四个,使用结构体位域。

这个方法同样是从概念入手,判断 p[0] 这个低地址保存的是低字节还是高字节。

 

 

#include 


struct Test
{
    unsigned int a : 8;
    unsigned int b : 8;
    unsigned int c : 16;
};


int main()
{
    struct Test t = {0x01, 0x02, 0x0304};
    unsigned char *p = (unsigned char *)&t;


    if (p[0] == 0x01)
        printf("小端字节序
");
    else if (p[0] == 0x04)
        printf("大端字节序
");


    return 0;
}

不过这个方法不太推荐,位域的具体布局取决于编译器,跟环境有关,所以这种方法,参考下就行。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分