首先看一下概念
Little-Endian
就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端
Big-Endian
就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。
第一种方式,在 C++ 程序运行期间判断并转换
#include <algorithm> // std::reverse // 判断和转换都在函数内部进行
template <typename T>
T LittleEndianToNative(const T x) {
int endian_test=;
char *p_endian_test=(char *)&endian_test;
if(*p_endian_test == ) {// 小端模式
// 直接返回即可
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;
}
}