Python struct与小端存储
在使用Python 實(shí)現(xiàn)字符向字節(jié)數(shù)據(jù)類型轉(zhuǎn)換的時(shí)候,Python沒有提供專門處理字節(jié)的數(shù)據(jù)類型,不過Python提供了一個(gè)Struct模塊提供bytes和其他二進(jìn)制數(shù)據(jù)類型的轉(zhuǎn)換
pack(),將任意數(shù)據(jù)類型轉(zhuǎn)變?yōu)閎ytes數(shù)據(jù)類型
>>> import struct >>> struct.pack('>I', 10240099) b'\x00\x9c@c'pack的第一個(gè)參數(shù)是處理指令,’>I’的意思是:
>表示字節(jié)順序是big-endian,也就是網(wǎng)絡(luò)序,I表示4字節(jié)無符號(hào)整數(shù)。后面的參數(shù)個(gè)數(shù)要和處理指令一致。如果不一致會(huì)報(bào)錯(cuò)
''' 遇到問題沒人解答?小編創(chuàng)建了一個(gè)Python學(xué)習(xí)交流QQ群:857662006 尋找有志同道合的小伙伴,互幫互助,群里還有不錯(cuò)的視頻學(xué)習(xí)教程和PDF電子書! ''' >>> struct.pack('I','2') Traceback (most recent call last):File "<stdin>", line 1, in <module> struct.error: required argument is not an integer >>>unpack把bytes變成相應(yīng)的數(shù)據(jù)類型:
>>> struct.unpack('>IH', b'\xf0\xf0\xf0\xf0\x80\x80') (4042322160, 32896)H代表兩個(gè)字節(jié)的無符號(hào)整數(shù),
c代表一個(gè)字節(jié)的字符
所以,盡管Python不適合編寫底層操作字節(jié)流的代碼,但在對性能要求不高的地方,利用struct就方便多了。
小端存儲(chǔ)
與數(shù)據(jù)在存儲(chǔ)器中的存放地址有關(guān)
小端存儲(chǔ):較低的有效字節(jié)存放在較低的存儲(chǔ)器地址,較高的有效字節(jié)存放在較高的存儲(chǔ)器地址
大端存儲(chǔ):較高的有效字節(jié)存放在較低的存儲(chǔ)器地址,較低的有效字節(jié)存放在較高的存儲(chǔ)器地址
為什么會(huì)有較高的有效字節(jié),和較低的有效字節(jié)的區(qū)分呢?
這是因?yàn)槟壳暗挠?jì)算機(jī)系統(tǒng)中,我們是以字節(jié)為單位的,每個(gè)地址單元都對應(yīng)著一個(gè)字節(jié),一個(gè)字節(jié)為8bit,而C語言中除了有8bit的char外,還有16bit的short類型,還用32bit的long類型(不同的編譯器還不一樣),那么加入我們存放一個(gè)長度32bit的整數(shù):
(由于一個(gè)地址單元是8bit,需要將這個(gè)長度為32bit的數(shù)據(jù)存放在4個(gè)地址單元中)
另外,對于16位或者32位的這些寄存器長度大于8位的處理器,由于寄存器的寬度大于一個(gè)內(nèi)存地址,也面臨這一個(gè)如何將多個(gè)字節(jié)安排的問題。
總結(jié)
以上是生活随笔為你收集整理的Python struct与小端存储的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python urllib与reques
- 下一篇: python 错误、调试、单元测试、文档