zoukankan      html  css  js  c++  java
  • 判断机器CPU的大小端模式并将数据转换成小端形式

    首先看一下概念

    Little-Endian

    就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端

    Big-Endian

    就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。

    第一种方式,在 C++ 程序运行期间判断并转换

    #include <algorithm> // std::reverse
    
    // 判断和转换都在函数内部进行
    template <typename T>
    T LittleEndianToNative(const T x) {
        int endian_test=1;
        char *p_endian_test=(char *)&endian_test;
        if(*p_endian_test == 1) {// 小端模式
            // 直接返回即可
            return x;
        } else {// 大端模式
            // 将大端模式转换成小端
            T data_reversed = x;
            std::reverse(reinterpret_cast<char*>(&data_reversed),
                         reinterpret_cast<char*>(&data_reversed) + sizeof(T));
            return data_reversed;
        }
    }

    第二种方式,在编译期检查

    检查机器的CPU是否为小端模式的

    #include <algorithm> // std::reverse
    
    inline bool LittleEndianCheck() {
    #ifdef BOOST_BIG_ENDIAN
        return false;
    #else
        return true;
    #endif
    }
    
    template <typename T>
    T LittleEndianToNative(const T x) {
        if (LittleEndianCheck()) {// 小端模式,直接返回即可
            return x;
        } else {// 大端模式,将大端模式转换成小端
            T data_reversed = x;
            std::reverse(reinterpret_cast<char*>(&data_reversed),
                         reinterpret_cast<char*>(&data_reversed) + sizeof(T));
            return data_reversed;
        }
    }
  • 相关阅读:
    第10章 指针(二) 首地址指针
    第10章 指针(五) 使用地址指针的引用
    第10章 指针(六) 指针小结
    C语言中的类模拟(C++编程思想)
    经典SQL语句大全
    C#ADO.NET操作数据代码汇总
    C#日期格式化
    第10章 指针(四) 地址簿指针变量
    数据库设计中的14个技巧
    第9章 预处理命令
  • 原文地址:https://www.cnblogs.com/phillee/p/12077155.html
Copyright © 2011-2022 走看看