Python是一門非常簡潔的語言,對於資料類型的表示,不像其他語言預定義了許多類型(如:在C#中,光整型就定義了8種),它只定義了六種基本類型:字串,整數,浮點數,元組,列表,字典。通過這六種資料類型,我們可以完成大部分工作。但當Python需要通過網路與其他的平台進行互動的時候,必須考慮到將這些資料類型與其他平台或語言之間的類型進行互相轉換問題。打個比方:C++寫的用戶端發送一個int型(4位元組)變數的資料到Python寫的伺服器,Python接收到表示這個整數的4個位元組資料,怎麼解析成Python認識的整數呢? Python的標準模組struct就用來解決這個問題。
struct模組的內容不多,也不是太難,下面對其中最常用的方法進行介紹:
struct.pack
struct.pack用於將Python的值根據格式符,轉換為字串(因為Python中沒有位元組(Byte)類型,可以把這裡的字串理解為位元組流,或位元組數組)。其函數原型為:struct.pack(fmt, v1, v2, ...),參數fmt是格式字串,關于格式字串的相關資訊在下面有所介紹。v1, v2, ...表示要轉換的python值。下面的例子將兩個整數轉換為字串(位元組流):
import struct</p><p>a = 20<br />b = 400</p><p>str = struct.pack("ii", a, b) #轉換後的str雖然是字串類型,但相當於其他語言中的位元組流(位元組數組),可以在網路上傳輸<br />print 'length:', len(str)<br />print str<br />print repr(str)</p><p>#---- result<br />#length: 8<br /># ----這裡是亂碼<br />#'/x14/x00/x00/x00/x90/x01/x00/x00'
格式符"i"表示轉換為int,'ii'表示有兩個int變數。進行轉換後的結果長度為8個位元組(int類型佔用4個位元組,兩個int為8個位元組),可以看到輸出的結果是亂碼,因為結果是位元據,所以顯示為亂碼。可以使用python的內建函數repr來擷取可識別的字串,其中十六進位的0x00000014, 0x00001009分別表示20和400。
struct.unpack
struct.unpack做的工作剛好與struct.pack相反,用於將位元組流轉換成python資料類型。它的函數原型為:struct.unpack(fmt, string),該函數返回一個元組。 下面是一個簡單的例子:str = struct.pack("ii", 20, 400)<br />a1, a2 = struct.unpack("ii", str)<br />print 'a1:', a1<br />print 'a2:', a2</p><p>#---- result:<br />#a1: 20<br />#a2: 400<br />
struct.calcsize
struct.calcsize用於計算格式字串所對應的結果的長度,如:struct.calcsize('ii'),返回8。因為兩個int類型所佔用的長度是8個位元組。
struct.pack_into, struct.unpack_from
這兩個函數在Python手冊中有所介紹,但沒有給出如何使用的例子。其實它們在實際應用中用的並不多。Google了很久,才找到一個例子,貼出來共用一下:
import struct<br />from ctypes import create_string_buffer</p><p>buf = create_string_buffer(12)<br />print repr(buf.raw)</p><p>struct.pack_into("iii", buf, 0, 1, 2, -1)<br />print repr(buf.raw)</p><p>print struct.unpack_from('iii', buf, 0)</p><p>#---- result<br />#'/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00'<br />#'/x01/x00/x00/x00/x02/x00/x00/x00/xff/xff/xff/xff'<br />#(1, 2, -1)
關于格式字串
在Python手冊中,給出了C語言中常用類型與Python類型對應的格式符:
格式符 |
C語言類型 |
Python類型 |
注 |
x |
pad byte |
no value |
|
c |
char |
string of length 1 |
|
b |
signed char |
integer |
|
B |
unsigned char |
integer |
|
? |
_Bool |
bool |
|
h |
short |
integer |
|
H |
unsigned short |
integer |
|
i |
int |
integer |
|
I |
unsigned int |
integer or long |
|
l |
long |
integer |
|
L |
unsigned long |
long |
|
q |
long long |
long |
|
Q |
unsigned long long |
long |
|
f |
float |
float |
|
d |
double |
float |
|
s |
char[] |
string |
|
p |
char[] |
string |
|
P |
void * |
long |
具體內容請參考Python手冊 struct 模組