大端模式和小端模式的判斷及其互相轉化
阿新 • • 發佈:2019-01-02
一.定義
大端模式(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;
}