【轉】[c/c++ ]字節序與大小端轉換--不錯


原文網址: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寫入文件時,要正確的轉換字節序,便需要知道其中每個數據成員的位置及大小,並基於每個成員的大小逐一進行適當的轉換
[cpp]  view plain copy 在CODE上查看代碼片 派生到我的代碼片
 
  1. //對應int32大小的成員 的轉換 范例   
  2. int32_t swapInt32(int32_t value)  
  3. {  
  4.      return ((value & 0x000000FF) << 24) |  
  5.                ((value & 0x0000FF00) << 8) |  
  6.                ((value & 0x00FF0000) >> 8) |  
  7.                ((value & 0xFF000000) >> 24) ;  
  8. }  
 
 
3.浮點數字節序轉換
浮點數的內部結構相對比較復雜,但仍然可以把浮點數當作整數轉換字節序,因為字節始終是字節,可以使用c++的reinterpret_cast操作把浮點數詮釋為整數,這稱為類型雙關(type_punning),或者使用一個簡便的方法是 使用union
 
[cpp]  view plain copy 在CODE上查看代碼片 派生到我的代碼片
 
  1. union intWithFloat  
  2. {  
  3.      int32_t m_i32;  
  4.      float m_f32;  
  5. }  
  6.   
  7. float swapFloat32(float value)  
  8. {  
  9.      intWithFloat i;  
  10.      i.m_i32 = value;  
  11.      i.m_f32 = swapInt32(i.m_i32)  
  12.      return i.m_f32;  
  13. }   


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM