資源描述:
《python的struct模塊》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、Python模塊學(xué)習(xí)----struct數(shù)據(jù)格式轉(zhuǎn)換2009-08-0501:00Python是一門非常簡潔的語言,對(duì)于數(shù)據(jù)類型的表示,不像其他語言預(yù)定義了許多類型(如:在C#中,光整型就定義了8種),它只定義了六種基本類型:字符串,整數(shù),浮點(diǎn)數(shù),元組,列表,字典。通過這六種數(shù)據(jù)類型,我們可以完成大部分工作。但當(dāng)Python需要通過網(wǎng)絡(luò)與其他的平臺(tái)進(jìn)行交互的時(shí)候,必須考慮到將這些數(shù)據(jù)類型與其他平臺(tái)或語言之間的類型進(jìn)行互相轉(zhuǎn)換問題。打個(gè)比方:C++寫的客戶端發(fā)送一個(gè)int型(4字節(jié))變量的數(shù)據(jù)到Python寫的服務(wù)器,
2、Python接收到表示這個(gè)整數(shù)的4個(gè)字節(jié)數(shù)據(jù),怎么解析成Python認(rèn)識(shí)的整數(shù)呢?Python的標(biāo)準(zhǔn)模塊struct就用來解決這個(gè)問題。struct模塊的內(nèi)容不多,也不是太難,下面對(duì)其中最常用的方法進(jìn)行介紹:最簡單的圖解:3s代表3個(gè)字節(jié)的string。每個(gè)s是一個(gè)Byte。(漢字2個(gè))。注:'10s'meansasingle10-bytestring(pythonDoc2.6.2)struct.pack struct.pack用于將Python的值根據(jù)格式符,轉(zhuǎn)換為字符串(因?yàn)镻ython中沒有字節(jié)(Byte)類
3、型,可以把這里的字符串理解為字節(jié)流,或字節(jié)數(shù)組)。其函數(shù)原型為:struct.pack(fmt,v1,v2,...),參數(shù)fmt是格式字符串,關(guān)于格式字符串的相關(guān)信息在下面有所介紹。v1,v2,...表示要轉(zhuǎn)換的python值。下面的例子將兩個(gè)整數(shù)轉(zhuǎn)換為字符串(字節(jié)流):1.importstruct??2.??3.a=20??4.b=400??5.??6.str=struct.pack("ii",a,b)??#轉(zhuǎn)換后的str雖然是字符串類型,但相當(dāng)于其他語言中的字節(jié)流(字節(jié)數(shù)組),可以在網(wǎng)絡(luò)上傳輸??7.print'
4、length:',len(str)??8.printstr??9.printrepr(str)??10.??11.#----result??1.#length:8??2.#????----這里是亂碼??3.#'x14x00x00x00x90x01x00x00'??importstructa=20b=400str=struct.pack("ii",a,b)#轉(zhuǎn)換后的str雖然是字符串類型,但相當(dāng)于其他語言中的字節(jié)流(字節(jié)數(shù)組),可以在網(wǎng)絡(luò)上傳輸print'length:',len(str)printst
5、rprintrepr(str)#----result#length:8#----這里是亂碼#'x14x00x00x00x90x01x00x00'格式符"i"表示轉(zhuǎn)換為int,'ii'表示有兩個(gè)int變量。進(jìn)行轉(zhuǎn)換后的結(jié)果長度為8個(gè)字節(jié)(int類型占用4個(gè)字節(jié),兩個(gè)int為8個(gè)字節(jié)),可以看到輸出的結(jié)果是亂碼,因?yàn)榻Y(jié)果是二進(jìn)制數(shù)據(jù),所以顯示為亂碼??梢允褂胮ython的內(nèi)置函數(shù)repr來獲取可識(shí)別的字符串,其中十六進(jìn)制的0x00000014,0x00000190分別表示20和400。struct.unp
6、ack struct.unpack做的工作剛好與struct.pack相反,用于將字節(jié)流轉(zhuǎn)換成python數(shù)據(jù)類型。它的函數(shù)原型為:struct.unpack(fmt,string),該函數(shù)返回一個(gè)元組。下面是一個(gè)簡單的例子:1.str=struct.pack("ii",20,400)??2.a1,a2=struct.unpack("ii",str)??3.print'a1:',a1??4.print'a2:',a2??5.??6.#----result:??7.#a1:20??8.#a2:400??str=str
7、uct.pack("ii",20,400)a1,a2=struct.unpack("ii",str)print'a1:',a1print'a2:',a2#----result:#a1:20#a2:400struct.calcsize struct.calcsize用于計(jì)算格式字符串所對(duì)應(yīng)的結(jié)果的長度,如:struct.calcsize('ii'),返回8。因?yàn)閮蓚€(gè)int類型所占用的長度是8個(gè)字節(jié)。struct.pack_into,struct.unpack_from 這兩個(gè)函數(shù)在Python手冊(cè)中有所介紹,但沒有
8、給出如何使用的例子。其實(shí)它們?cè)趯?shí)際應(yīng)用中用的并不多。Google了很久,才找到一個(gè)例子,貼出來共享一下:1.importstruct??2.fromctypesimportcreate_string_buffer??3.??4.buf=create_string_buffer(12)??5.printrepr(buf.raw)??6.??7.s