[c/c++ ]位元組序與大小端轉換
阿新 • • 發佈:2019-02-08
註明: 以下內容均為學習內容整理,記錄,便於自己學習,並非完全意義上的自產,如有感到不適,請聯絡我
一.多位元組值及位元組序
1.brief 現在有一個數字 65430,這個數字在二進位制的記憶體中一個位元組無法完全存下,儲存這個數字需要1個位元組以上的空間。這樣的值被稱為多位元組量(multi-byte quantity)。 65430在記憶體中由兩個位元組表示:0xFF 和 0x96 ,其中: 0xFF被稱為最高有效位元組(most significant byte, MSB) 0x96 被稱為最低有效位元組(last significant byte, LSB) 在記憶體中儲存這樣的多位元組整數有兩種方式 大端:最高有效位元組儲存在較低的記憶體位置 such as: 0x0->0xFF 0x1->0x96 小端:最低有效位元組儲存在較低的記憶體位置 such as: 0x0->0x96 0x1->0xFF 2.整數字節序轉換 整個過程從該值的MSB和LSB開始交換,直到交換至該值的中間點,唯一的難點在於,由於不能簡單的把物件(結構型資料)轉換為位元組陣列去用單一的通用函式轉換位元組,所以需要知道哪些位元組序需要轉換,例如 把記憶體中的struc或class寫入檔案時,要正確的轉換位元組序,便需要知道其中每個資料成員的位置及大小,並基於每個成員的大小逐一進行適當的轉換3.浮點數字節序轉換 浮點數的內部結構相對比較複雜,但仍然可以把浮點數當作整數轉換位元組序,因為位元組始終是位元組,可以使用c++的reinterpret_cast操作把浮點數詮釋為整數,這稱為型別雙關(type_punning),或者使用一個簡便的方法是 使用union//對應int32大小的成員 的轉換 範例 int32_t swapInt32(int32_t value) { return ((value & 0x000000FF) << 24) | ((value & 0x0000FF00) << 8) | ((value & 0x00FF0000) >> 8) | ((value & 0xFF000000) >> 24) ; }
union intWithFloat { int32_t m_i32; float m_f32; } float swapFloat32(float value) { intWithFloat i; i.m_i32 = value; i.m_f32 = swapInt32(i.m_i32) return i.m_f32; }