zoukankan      html  css  js  c++  java
  • 如何判断设备大小端问题

    1. 如何判断大小端设备

    #include <iostream>
    using namespace std;
    
    typedef union utest
    {
        int a;
        char b;
        
    }utest;
    
    int main(int argc, char** argv)
    {
        utest ut;
        ut.a = 0xff030211;
    
        if (ut.b == 0x11)
        {
            std::cout << "this is le" << std::endl;
        }
        else if (ut.b == 0xff)
        {
            std::cout << "this is be" << std::endl;
        }    
        
        return 0;
    }

    解释:通过使用共用体的方式判断是否是大端设备,还是小端设备:

       在union中,所占的字节数为最大的成员所占自己数:对于大端设备,数据的低字节存放在内存中的高地址,高字节存在在内存的低地址;

       而对于char类型,只是一个字节,大小端对齐存放位置无影响,存放在低地址;

       因此,如果是大端设备,0xff030211数据中,0x11应该存放在高地址位,0xff存放在低地址位;

         此时,通过char 取低地址判断值即可确定大小端设备;

    2. 如何将大端字节序和小端字节序进行互换

      linux系统中存在以下几个系统级别的宏:

      __BYTE_ORDER  ==  __BIG_ENDIAN //   等式成立,则表示大端设备;

      __BYTE_ORDER  ==  __LITTLE_ENDIAN  // 等式成立,则表示小端设备;

       

      大小端字节序互换可使用,以下两个系统的函数,进行字节序互换:

      #include <byteswap.h>

      __bswap_32   4字节

      __bswap_16  2字节

      

    int main(int argc, char** argv)
    {
        int a = 0xcc030211;
        
        printf("a = 0x%04x
    ", a);
    
        a = __bswap_32(a);
        
        printf("a = 0x%04x
    ", a);
        
        return 0;
    }
    a = 0xcc030211
    a = 0x110203cc
    int main(int argc, char** argv)
    {
        int a = 0xcc030211;
        
        printf("a = 0x%04x
    ", a);
    
        a = __bswap_32(a);
        
        printf("a = 0x%04x
    ", a);
    
    
        unsigned short b = 0xff11;
        
        printf("b = 0x%x
    ", b);
    
        b = __bswap_16(b);
        
        printf("b = 0x%x
    ", b);
    
        return 0;
        
    }
    a = 0xcc030211
    a = 0x110203cc
    b = 0xff11
    b = 0x11ff
  • 相关阅读:
    hdoj--1162--Eddy's picture(最小生成树)
    hdoj--1087--Super Jumping! Jumping! Jumping!(贪心)
    hdoj--1051--Wooden Sticks(LIS)
    hdoj--5532--Almost Sorted Array(正反LIS)
    CodeForces--609C --Load Balancing(水题)
    poj--2631--Roads in the North(树的直径 裸模板)
    CodeForces--606A --Magic Spheres(模拟水题)
    CodeForcess--609B--The Best Gift(模拟水题)
    hdoj--1201--18岁生日(模拟)
    poj--1985--Cow Marathon(树的直径)
  • 原文地址:https://www.cnblogs.com/weiyouqing/p/12519902.html
Copyright © 2011-2022 走看看