一.定义
大端模式(Big Endian):数据的高字节,保存在内存的低地址中;数据的低字节,保存在内存的高地址中。
小端模式(Little Endian):数据的高字节,保存在内存的高地址中;数据的低字节,保存在内存的低地址中。
二.大小端模式的判断
使用联合,通过判断首个成员的值,确定是大端还是小端模式:
bool IsBigEndian(){
union NUM{
int a;
char b;
}num;
num.a = 0x1234; //低位->高位:大端:12,34;小端:34,12
if( num.b == 0x12 )//num.b取低8位
return true;
return false;
}
三、大端模式和小端模式转换
使用移位运算:而且该方法亦可用于小端模式转成大端模式。
//32bit
/*将低8位(0~8位)左移24位,变成了高8位(24~32位);8~16位左移8位变成了(16~24位);
将原高8位和高16位右移,变成了新的低8位和低16位。*/
uint32_t reversebytes_uint32t(uint32_t value){
return (value & 0x000000FF) << 24 | (value & 0x0000FF00) << 8 |
(value & 0x00FF0000) >> 8 | (value & 0xFF000000) >> 24;
}
//64bit
// 先将64位的低32位转成小端模式,再将64位的高32位转成小端模式
// 在将原来的低32位放置到高32位,原来的高32位放置到低32位
uint64_t reversebytes_uint64t(uint64_t value){
uint32_t high_uint64 =
(uint64_t)reversebytes_uint32t(uint32_t(value));// 低32位转成小端
uint64_t low_uint64 =
(uint64_t)reversebytes_uint32t(uint32_t(value >> 32));// 高32位转成小端
return (high_uint64 << 32) + low_uint64;
}