【转】理解字节序 大端字节序和小端字节序
轉自:https://www.cnblogs.com/gremount/p/8830707.html
以下內容參考了
http://www.ruanyifeng.com/blog/2016/11/byte-order.html
https://blog.csdn.net/yishengzhiai005/article/details/39672529
?
1.
計算機硬件有兩種儲存數據的方式:大端字節序(big endian)和小端字節序(little endian)。
舉例來說,數值0x2211使用兩個字節儲存:高位字節是0x22,低位字節是0x11,那么大小端存儲有以下協議:
- 大端字節序:高位字節在前,低位字節在后,這是人類讀寫數值的方法。
- 小端字節序:低位字節在前,高位字節在后,即以0x1122形式儲存。
?
同理,0x1234567的大端字節序和小端字節序的寫法如下圖。
2.
我一直不理解,為什么要有字節序,每次讀寫都要區分,多麻煩!統一使用大端字節序,不是更方便嗎?
上周,我讀到了一篇文章,解答了所有的疑問。而且,我發現原來的理解是錯的,字節序其實很簡單。
3.
首先,為什么會有小端字節序?
答案是,計算機電路先處理低位字節,效率比較高,因為計算都是從低位開始的。所以,計算機的內部處理都是小端字節序。
但是,人類還是習慣讀寫大端字節序。所以,除了計算機的內部處理,其他的場合幾乎都是大端字節序,比如網絡傳輸和文件儲存。
4.
計算機處理字節序的時候,不知道什么是高位字節,什么是低位字節。它只知道按順序讀取字節,先讀第一個字節,再讀第二個字節。
如果是大端字節序,先讀到的就是高位字節,后讀到的就是低位字節。小端字節序正好相反。
理解這一點,才能理解計算機如何處理字節序。
5.
字節序的處理,就是一句話:
"只有讀取的時候,才必須區分字節序,其他情況都不用考慮。"
處理器讀取外部數據的時候,必須知道數據的字節序,將其轉成正確的值。然后,就正常使用這個值,完全不用再考慮字節序。
即使是向外部設備寫入數據,也不用考慮字節序,正常寫入一個值即可。外部設備會自己處理字節序的問題。
6.?
字節序轉換的例子
不同cpu平臺上字節序通常也不一樣,下面寫個簡單的C程序,它可以測試不同平臺上的字節序。
| 1? | #include?<stdio.h> |
| 2? | #include?<netinet/in.h> |
| 3? | int?main() |
| 4? | { |
| 5? | ????int?i_num?=?0x12345678; |
| 6? | ????printf("[0]:0x%x\n",?*((char?*)&i_num?+?0)); |
| 7? | ????printf("[1]:0x%x\n",?*((char?*)&i_num?+?1)); |
| 8? | ????printf("[2]:0x%x\n",?*((char?*)&i_num?+?2)); |
| 9? | ????printf("[3]:0x%x\n",?*((char?*)&i_num?+?3)); |
| 10? | ? |
| 11? | ????i_num?=?htonl(i_num); |
| 12? | ????printf("[0]:0x%x\n",?*((char?*)&i_num?+?0)); |
| 13? | ????printf("[1]:0x%x\n",?*((char?*)&i_num?+?1)); |
| 14? | ????printf("[2]:0x%x\n",?*((char?*)&i_num?+?2)); |
| 15? | ????printf("[3]:0x%x\n",?*((char?*)&i_num?+?3)); |
| 16? | ? |
| 17? | ????return?0; |
| 18? | }? |
在80X86CPU平臺上,執行該程序得到如下結果:?
[0]:0x78?
[1]:0x56?
[2]:0x34?
[3]:0x12
[0]:0x12?
[1]:0x34?
[2]:0x56?
[3]:0x78
分析結果,在80X86平臺上,系統將多字節中的低位存儲在變量起始地址,使用小端法。htonl將i_num轉換成網絡字節序,可見網絡字節序是大端法。
總結
以上是生活随笔為你收集整理的【转】理解字节序 大端字节序和小端字节序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2017怎么使用信用卡免费取现
- 下一篇: ArcGIS如何在一个矢量上用不同颜色进