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