Python3 struct模塊的基本用法
大家好!今天我給大家介紹一下“struct模塊的基本用法”。通過(guò)struct模塊可以將數(shù)據(jù)包裝成C語(yǔ)言類(lèi)型的二進(jìn)制字節(jié)流。通過(guò)這種字節(jié)流,可以非常方便地與其他語(yǔ)言開(kāi)發(fā)的模塊和程序進(jìn)行二進(jìn)制格式的數(shù)據(jù)交
大家好!今天我給大家介紹一下“struct模塊的基本用法”。通過(guò)struct模塊可以將數(shù)據(jù)包裝成C語(yǔ)言類(lèi)型的二進(jìn)制字節(jié)流。通過(guò)這種字節(jié)流,可以非常方便地與其他語(yǔ)言開(kāi)發(fā)的模塊和程序進(jìn)行二進(jìn)制格式的數(shù)據(jù)交互。彌補(bǔ)了Python內(nèi)建I/O函數(shù)只能操作字符串的不足。如果您覺(jué)得這篇教程有幫助,請(qǐng)為我投上寶貴的一票,謝謝!如果您對(duì)我寫(xiě)的系列教程感興趣,請(qǐng)“關(guān)注”我吧!
啟動(dòng)IDLE程序
1. 必須安裝Python 3后,啟動(dòng)IDLE程序。點(diǎn)擊界面菜單中的“File > New File”,新建一個(gè)空白的Python源代碼文件,然后保存為“study_struct_”文件。
struct模塊的打包和解包
2. 在Python 3中的struct模塊提供了一系列的打包和解包函數(shù)以及一個(gè)名為Struct的類(lèi)。這兩種方式在功能上并沒(méi)有區(qū)別,你可以根據(jù)代碼環(huán)境自由選擇。通過(guò)函數(shù),可以將數(shù)據(jù)按照指定的格式(請(qǐng)參考Python 3幫助手冊(cè),搜索“struct”)打包到字節(jié)流中。而通過(guò)struct.unpack函數(shù),則可以將字節(jié)流中的數(shù)據(jù)按指定的格式還原為Python數(shù)據(jù)。
體驗(yàn)打包和解包
3. 清楚了struct模塊的打包和解包用法后,接下來(lái),可以通過(guò)代碼體驗(yàn)一下它們的具體用法。在“study_struct_”源代碼文件中,導(dǎo)入struct模塊,然后在try…except塊中添加打包Python數(shù)據(jù)的代碼并輸出打包后的數(shù)據(jù)。代碼編寫(xiě)完畢后,點(diǎn)擊F5運(yùn)行程序。一切正常時(shí),可以在Shell窗口中見(jiàn)到輸出的結(jié)果。
4. 繼續(xù)向源代碼的try…except塊中添加解包字節(jié)流并輸出解包數(shù)據(jù)的代碼,然后點(diǎn)擊F5運(yùn)行。一切正常時(shí),可以在Shell窗口中見(jiàn)到解包后的數(shù)據(jù)與最初傳入的數(shù)據(jù)相同,除了那個(gè)0.1535,這個(gè)實(shí)際是浮點(diǎn)數(shù)的誤差,屬于正?,F(xiàn)象。
使用Struct類(lèi)
5. Python的struct模塊中同時(shí)提供了Struct類(lèi),通過(guò)該類(lèi)的pack和unpack方法,同樣可以打包和解包二進(jìn)制數(shù)據(jù)。調(diào)用時(shí),需要注意傳入的參數(shù)類(lèi)型,別跟同名的函數(shù)弄混了,它可以Struct對(duì)象。
6. 向源代碼的try…except塊中追加通過(guò)Struct類(lèi)對(duì)象打包和解包數(shù)據(jù)的代碼,然后按F5運(yùn)行。核對(duì)Shell窗口中打印的數(shù)據(jù),可以確定其結(jié)果與struct函數(shù)輸出的一致。
pack_into和unpack_from函數(shù)
7. struct模塊中提供了_into和struct.unpack_from函數(shù),用于將數(shù)據(jù)打包到緩沖區(qū)(比如:array對(duì)象),以及從緩沖區(qū)中解包數(shù)據(jù)。使用pack_into函數(shù)時(shí),需要提供一個(gè)可寫(xiě)的緩沖區(qū),可以通過(guò)array模塊中提供的array函數(shù)創(chuàng)建,在創(chuàng)建array對(duì)象時(shí),可以傳入一個(gè)推導(dǎo)列表用于設(shè)置array的長(zhǎng)度。
8. 繼續(xù)向源代碼文件的try…except塊中添加“打包數(shù)據(jù)到緩沖區(qū)”的測(cè)試代碼。代碼編寫(xiě)完之后,點(diǎn)擊F5運(yùn)行。在Shell窗口中,可以見(jiàn)到打包數(shù)據(jù)的輸出結(jié)果,直接用print輸出array時(shí),它會(huì)以array的存儲(chǔ)格式輸出數(shù)據(jù)。將其轉(zhuǎn)換為二進(jìn)制后,輸出的結(jié)果就與之前的一致了。
9. 繼續(xù)向源代碼文件的try…except塊中添加“從緩沖區(qū)解包數(shù)據(jù)”的測(cè)試代碼,然后按F5運(yùn)行。在Shell窗口中,可以見(jiàn)到與之前輸出一致的解碼數(shù)據(jù)。
iter_unpack函數(shù)
模塊還提供了一個(gè)以固定格式遍歷解包字節(jié)流的函數(shù)iter_unpack。主要用在循環(huán)中,以固定格式解碼字節(jié)流中的所有數(shù)據(jù)。
11. 繼續(xù)向源代碼文件的try…except塊中追加“以字符格式遍歷解包字節(jié)流”的代碼,然后按F5運(yùn)行。代碼運(yùn)行結(jié)束后,可以在Shell窗口中見(jiàn)到打印的所有字節(jié)數(shù)據(jù)。由于_unpack返回的是一個(gè)iterator,所以輸出的數(shù)據(jù)格式都是iterator的格式。
總結(jié)
至此,Python中struct模塊的基本用法就介紹完畢了,下一篇文章中,我會(huì)向大家介紹一下在Python中通過(guò)二進(jìn)制文件與C代碼進(jìn)行交互的方法。敬請(qǐng)期待!Enjoy!~