1. 程式人生 > >大端模式和小端模式的判斷及其互相轉化

大端模式和小端模式的判斷及其互相轉化

一.定義

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