Python struct與小端儲存

2022-08-18 22:06:16 字數 1397 閱讀 6355

在使用python 實現字元向位元組資料型別轉換的時候,python沒有提供專門處理位元組的資料型別,不過python提供了乙個struct模組提供bytes和其他二進位制資料型別的轉換

pack(),將任意資料型別轉變為bytes資料型別

>>> import struct

>>> struct.pack('>i', 10240099)

b'\x00\x9c@c'

pack的第乙個引數是處理指令,'>i'的意思是:>表示位元組順序是big-endian,也就是網路序,i表示4位元組無符號整數。

後面的引數個數要和處理指令一致。如果不一致會報錯

>>> struct.pack('i','2')

traceback (most recent call last):

file "", line 1, in struct.error: required argument is not an integer

>>>

unpackbytes變成相應的資料型別:

>>> struct.unpack('>ih', b'\xf0\xf0\xf0\xf0\x80\x80')

(4042322160, 32896)

h代表兩個位元組的無符號整數,c代表乙個位元組的字元所以,儘管python不適合編寫底層操作位元組流的**,但在對效能要求不高的地方,利用struct就方便多了

struct模組定義的資料型別可以參考python官方文件:

與資料在儲存器中的存放位址有關

為什麼會有較高的有效位元組,和較低的有效位元組的區分呢?

這是因為目前的計算機系統中,我們是以位元組為單位的,每個位址單元都對應著乙個位元組,乙個位元組為8bit,而c語言中除了有8bit的char外,還有16bit的short型別,還用32bit的long型別(不同的編譯器還不一樣),那麼加入我們存放乙個長度32bit的整數:

(由於乙個位址單元是8bit,需要將這個長度為32bit的資料存放在4個位址單元中)

另外,對於16位或者32位的這些暫存器長度大於8位的處理器,由於暫存器的寬度大於乙個記憶體位址,也面臨這乙個如何將多個位元組安排的問題。

大端與小端

網際網路使用網路位元組順序採用大端模式進行編址,大端儲存也稱為網路位元組序,因為tcp ip包在網路中傳輸時都要求以這種次序,以其他形式儲存資料的機器 主機位元組順序根據處理器的不同而不同,如powerpc處理器,使用大端模式,而pentuim處理器使用小端模式 則必須在傳送資料之前把首部轉換成網路...

大端與小端

端模式 endian 的這個詞出自 jonathan swift 書寫的 格列佛遊記 這本書根據將雞蛋敲開的方法不同將所有的人分為兩類,從圓頭開始將雞蛋敲開的人被歸為 big endian 從尖頭開始將雞蛋敲開的人被歸為 littile endian 小人國的內戰就源於吃雞蛋時是究竟從大頭 big ...

大端與小端

大端表示跟小端表示這兩者的具體意義我老是記不住,當然不是說它的意思不懂,而只是容易搞混。現在記一下,以後就比較有印象了。在c 中,定義乙個int值的時候,它所占用的記憶體是4個位元組,然而這4個位元組裡面,我們如果得到這個int值的記憶體位址,其實就是它的最低位置的位址,如 int a 假設 a的記...