計算機儲存資料是按大端或者小端將資料儲存在記憶體上. 一般處理器都只選擇其中的一種, 通常intel
和amd
處理器都是採用小端儲存方式, 也有一些處理器是採用大端方式, 如果ibm
公司的處理器.
小端儲存 :
0x1003
0x78
0x1002
0x56
0x1001
0x34
0x1000
0x12
大端儲存 :
0x1003
0x12
0x1002
0x34
0x1001
0x56
0x1000
0x78
大端跟小端儲存資料的方式就不一樣. 比如像0x12345678
, 在兩種方式的儲存如上. 小端 : 將高位元組放在高位, 低位元組放在低位. 大端 : 將高位元組放在低位, 低位元組放在高位. 如果我們在傳輸資料的時候如果小端處理器傳送給大端處理器, 那麼在接收資料後都無法辨認資料究竟是什麼, 所以為了保證資料可以在不同的儲存方式上都能夠被正確的接收, 規定網路傳輸是大端傳輸, 當資料接收到本地時再根據處理器儲存資料的方式進行轉化, 這樣就保證接收後不會資料無法辨認.
驗證本機的儲存方式
大端還是小端的驗證有很多種方法, 這裡就簡單的用兩種方式來驗證.
實驗一
大端跟小端是在儲存資料的方式上不一樣, 就像0x12345678
, 我們將其中的低位元組取出來檢視是0x12
還是0x78
就可以驗證本機的使用的是小端還是大端了.
#include
#include
#include
intmain
(int argc,
char
*ar**)
我的電腦驗證的是小端.
實驗二
我們也可以用union
來驗證, 原理與上面一樣的, 只是運用了union
本身就是直接共用儲存空間的.
#include
#include
#include
union tmp
;int
main
(int argc,
char
*ar**)
大端和小端之間的轉換
在網路程式設計中, 可以使用以下4個函式對資料在大小端之間進行轉換.
#include
uint32_t htonl
(uint32_t)
;// 本機位元組轉為網路位元組(32位)
uint32_t ntohl
(uint32_t)
;// 網路位元組轉為本機位元組(32位)
uint16_t htons
(uint16_t)
;// 本機位元組轉為網路位元組(16位)
uint16_t ntohs
(uint16_t)
;// 網路位元組轉為本機位元組(16位)
網路位元組是大端方式. 上面函式的可以這樣記 :h
表示host
(本機),n
表示network
(網路),to
轉換,l
長位元組,s
短位元組.
可以使用驗證一下 :
#include
#include
#include
#include
intmain
(int argc,
char
*ar**)
完整** : 大端小端 總結
這裡僅僅用簡單的例子驗證本機的大小端, 重點明白
(1 1 27)大端和小端問題
所謂的大端模式,是指資料的低位儲存在記憶體的高位址中,而資料的高位,儲存在記憶體的低位址中 網路傳輸是大端儲存模式 所謂的小端模式,是指資料的低位儲存在記憶體的低位址中,而資料的高位儲存在記憶體的高位址中。為什麼會有大小端模式之分呢?這是因為在計算機系統中,我們是以位元組為單位的,每個位址單元都對應...
002 大端和小端的區別
一 大小端出現原因 計算機系統是以位元組為單位的,每個位址單元都對應著乙個位元組,乙個位元組為8bit。但對於位數大於8位的處理器,如16位或32位 64位的處理器,由於暫存器寬度大於乙個位元組,那麼必然存在乙個如何將多個位元組安排的問題。因此就導致了大端儲存模式和小端儲存模式的出現。二 為什麼會有...
認識(大端 小端)端模式
端模式 endian 的這個詞出自jonathan swift書寫的 格列佛遊記 這本書根據將雞蛋敲開的方法不同將所有的人分為兩類,從圓頭開始將雞蛋敲開的人被歸為big endian,從尖頭開始將雞蛋敲開的人被歸為littile endian。小人國的內戰就源於吃雞蛋時是究竟從大頭 big endi...