原文網址:http://blog.csdn.net/kuai0705/article/details/20841133
注明: 以下內容均為學習內容整理,記錄,便於自己學習,並非完全意義上的自產,如有感到不適,請聯系我
一.多字節值及字節序
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寫入文件時,要正確的轉換字節序,便需要知道其中每個數據成員的位置及大小,並基於每個成員的大小逐一進行適當的轉換
- //對應int32大小的成員 的轉換 范例
- int32_t swapInt32(int32_t value)
- {
- return ((value & 0x000000FF) << 24) |
- ((value & 0x0000FF00) << 8) |
- ((value & 0x00FF0000) >> 8) |
- ((value & 0xFF000000) >> 24) ;
- }
3.浮點數字節序轉換
浮點數的內部結構相對比較復雜,但仍然可以把浮點數當作整數轉換字節序,因為字節始終是字節,可以使用c++的reinterpret_cast操作把浮點數詮釋為整數,這稱為類型雙關(type_punning),或者使用一個簡便的方法是 使用union
- 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;
- }