Python是一門非常簡潔的語言,對于數(shù)據(jù)類型的表示,不像其他語言預(yù)定義了許多類型(如:在C#中,光整型就定義了8種),它只 定義了六種基本類型:字符串,整數(shù),浮點數(shù),元組,列表,字典。通過這六種數(shù)據(jù)類型,我們可以完成大部分工作。但當(dāng)Python需要通過網(wǎng)絡(luò)與其他的平臺 進(jìn)行交互的時候,必須考慮到將這些數(shù)據(jù)類型與其他平臺或語言之間的類型進(jìn)行互相轉(zhuǎn)換問題。打個比方:C++寫的客戶端發(fā)送一個int型(4字節(jié))變量的數(shù) 據(jù)到Python寫的服務(wù)器,Python接收到表示這個整數(shù)的4個字節(jié)數(shù)據(jù),怎么解析成Python認(rèn)識的整數(shù)呢? Python的標(biāo)準(zhǔn)模塊struct就用來解決這個問題。 struct模塊的內(nèi)容不多,也不是太難,下面對其中最常用的方法進(jìn)行介紹: struct.packstruct.pack用于將Python的值根據(jù)格式符,轉(zhuǎn)換為字符串(因為Python中沒有字節(jié)(Byte)類型,可以把這里的字符串理解為字節(jié)流,或字節(jié)數(shù)組)。其函數(shù)原型為:struct.pack(fmt, v1, v2, ...),參數(shù)fmt是格式字符串,關(guān)于格式字符串的相關(guān)信息在下面有所介紹。v1, v2, ...表示要轉(zhuǎn)換的python值。下面的例子將兩個整數(shù)轉(zhuǎn)換為字符串(字節(jié)流):
格式符"i"表示轉(zhuǎn)換為int,'ii'表示有兩個int變量。進(jìn)行轉(zhuǎn)換后的結(jié)果長度為8個字節(jié)(int類型占用4個字節(jié),兩個int為8個字 節(jié)),可以看到輸出的結(jié)果是亂碼,因為結(jié)果是二進(jìn)制數(shù)據(jù),所以顯示為亂碼。可以使用python的內(nèi)置函數(shù)repr來獲取可識別的字符串,其中十六進(jìn)制的 0x00000014, 0x00001009分別表示20和400。 struct.unpackstruct.unpack做的工作剛好與struct.pack相反,用于將字節(jié)流轉(zhuǎn)換成python數(shù)據(jù)類型。它的函數(shù)原型為:struct.unpack(fmt, string),該函數(shù)返回一個 元組 。 下面是一個簡單的例子: struct.calcsizestruct.calcsize用于計算格式字符串所對應(yīng)的結(jié)果的長度,如:struct.calcsize('ii'),返回8。因為兩個int類型所占用的長度是8個字節(jié)。 struct.pack_into, struct.unpack_from這兩個函數(shù)在Python手冊中有所介紹,但沒有給出如何使用的例子。其實它們在實際應(yīng)用中用的并不多。Google了很久,才找到一個例子,貼出來共享一下:
在Python手冊中,給出了C語言中常用類型與Python類型對應(yīng)的格式符:
|
|