判断机器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;
    }
}
posted @ 2019-12-22 14:27  coffee_tea_or_me  阅读(728)  评论(0编辑  收藏  举报