首先看一下概念
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; } }