最近在學習python網(wǎng)絡編程這一塊,在寫簡單的socket通信代碼時,遇到了struct這個模塊的使用,當時不太清楚這到底有和作用,后來查閱了相關資料大概了解了,在這里做一下簡單的總結。
了解c語言的人,一定會知道struct結構體在c語言中的作用,它定義了一種結構,里面包含不同類型的數(shù)據(jù)(int,char,bool等等),方便對某一結構對象進行處理。而在網(wǎng)絡通信當中,大多傳遞的數(shù)據(jù)是以二進制流(binarydata)存在的。當傳遞字符串時,不必擔心太多的問題,而當傳遞諸如int、char之類的基本數(shù)據(jù)的時候,就需要有一種機制將某些特定的結構體類型打包成二進制流的字符串然后再網(wǎng)絡傳輸,而接收端也應該可以通過某種機制進行解包還原出原始的結構體數(shù)據(jù)。python中的struct模塊就提供了這樣的機制,該模塊的主要作用就是對python基本類型值與用python字符串格式表示的Cstruct類型間的轉(zhuǎn)化(ThismoduleperformsconversionsbetweenPythonvaluesandCstructsrepresentedasPythonstrings.)。stuct模塊提供了很簡單的幾個函數(shù),下面寫幾個例子。
1、基本的pack和unpack
struct提供用formatspecifier方式對數(shù)據(jù)進行打包和解包(PackingandUnpacking)。例如:
importstruct
importbinascii
values=(1,'abc',2.7)
s=struct.Struct('I3sf')
packed_data=s.pack(*values)
unpacked_data=s.unpack(packed_data)
print'Originalvalues:',values
print'Formatstring:',s.format
print'Uses:',s.size,'bytes'
print'PackedValue:',binascii.hexlify(packed_data)
print'UnpackedType:',type(unpacked_data),'Value:',unpacked_data
輸出:
Originalvalues:(1,'abc',2.7)
Formatstring:I3sf
Uses:12bytes
PackedValue:0100000061626300cdcc2c40
UnpackedType:Value:(1,'abc',2.700000047683716)
代碼中,首先定義了一個元組數(shù)據(jù),包含int、string、float三種數(shù)據(jù)類型,然后定義了struct對象,并制定了format‘I3sf’,I表示int,3s表示三個字符長度的字符串,f表示float。最后通過struct的pack和unpack進行打包和解包。通過輸出結果可以發(fā)現(xiàn),value被pack之后,轉(zhuǎn)化為了一段二進制字節(jié)串,而unpack可以把該字節(jié)串再轉(zhuǎn)換回一個元組,但是值得注意的是對于float的精度發(fā)生了改變,這是由一些比如操作系統(tǒng)等客觀因素所決定的。打包之后的數(shù)據(jù)所占用的字節(jié)數(shù)與C語言中的struct十分相似。
以上內(nèi)容為大家介紹了淺析Python中的struct模塊,希望對大家有所幫助,如果想要了解更多Python相關知識,請關注IT培訓機構:千鋒教育。