大端模式和小端模式的判断及其互相转化

一.定义

大端模式(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;  
}  

你可能感兴趣的:(linux操作系统与网络编程)