Python模組學習 struct 資料格式轉換

2021-07-25 21:30:07 字數 3565 閱讀 9009

darkbull

python是一門非常簡潔的語言,對於資料型別的表示,不像其他語言預定義了許多態別(如:在c#中,光整型就定義了8種),它只定義了六種基本型別:字串,整數,浮點數,元組,列表,字典。通過這六種資料型別,我們可以完成大部分工作。但當python需要通過網路與其他的平台進行互動的時候,必須考慮到將這些資料型別與其他平台或語言之間的型別進行互相轉換問題。打個比方:c++寫的客戶端傳送乙個int型(4位元組)變數的資料到python寫的伺服器,python接收到表示這個整數的4個位元組資料,怎麼解析成python認識的整數呢? python的標準模組struct就用來解決這個問題。

struct模組的內容不多,也不是太難,下面對其中最常用的方法進行介紹:

struct.pack用於將python的值根據格式符,轉換為字串(因為python中沒有位元組(byte)型別,可以把這裡的字串理解為位元組流,或位元組陣列)。其函式原型為:struct.pack(fmt, v1, v2, …),引數fmt是格式字串,關於格式字串的相關資訊在下面有所介紹。v1, v2, …表示要轉換的python值。下面的例子將兩個整數轉換為字串(位元組流):

python

1

2

3

4

5

6

7

8

9

10

11

12

13

14

import

struct

a=20 b

=400

str=

struct

.pack

("ii",a

,b)#轉換後的str雖然是字串型別,但相當於其他語言中的位元組流(位元組陣列),可以在網路上傳輸

print

'length:'

,len

(str

) print

str print

repr

(str

)

#---- result

#length: 8

#    ----這裡是亂碼

#'/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.pack相反,用於將位元組流轉換成python資料型別。它的函式原型為:struct.unpack(fmt, string),該函式返回乙個元組。 下面是乙個簡單的例子:

python

1

2

3

4

5

6

7

8

str=struct

.pack

("ii",20

,400)

a1,a2

=struct

.unpack

("ii"

,str)

print

'a1:',a1

print

'a2:',a2

#---- result:

#a1: 20

#a2: 400

struct.calcsize用於計算格式字串所對應的結果的長度,如:struct.calcsize(『ii』),返回8。因為兩個int型別所占用的長度是8個位元組。

這兩個函式在python手冊中有所介紹,但沒有給出如何使用的例子。其實它們在實際應用中用的並不多。google了很久,才找到乙個例子,貼出來共享一下:

python

12

3

4

5

6

7

8

9

10

11

12

13

14

15

import

struct

from

ctypes

import

create_string_buffer

buf=

create_string_buffer(12

) print

repr

(buf

.raw)

struct

.pack_into

("iii"

,buf,0

,1,2

,-1)

print

repr

(buf

.raw)

print

struct

.unpack_from

('iii'

,buf,0

) #---- result

#'/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00'

#'/x01/x00/x00/x00/x02/x00/x00/x00/xff/xff/xff/xff'

#(1, 2, -1)

在python手冊中,給出了c語言中常用型別與python型別對應的格式符:

格式符c語言型別

python型別注x

pad byte

no value

cchar

string of length 1

bsigned char

integer

bunsigned char

integer

?_bool

bool

hshort

integer

hunsigned short

integer

iint

integer

iunsigned int

integer or long

llong

integer

lunsigned long

long

qlong long

long

qunsigned long long

long

ffloat

float

ddouble

float

schar

string

pchar

string

pvoid *

long

具體內容請參考python手冊 struct 模組

python學習(模組)

模組搜尋路徑 匯入乙個叫 spam 的模組時,直譯器先在當前目錄中搜尋名為 spam.py 的檔案,然後在環境變數 pythonpath 指琮的目錄列表中搜尋,然後是環境變數 path 中的路徑列表。如果 pythonpath 沒有設定,或者檔案沒有找到,接下來搜尋安裝目錄,在 unix 中,通常是...

python 模組學習

一 from django.contrib.auth.hashers import make password 通過函式名即可發現,主要有兩個函式,分別是建立密碼和驗證 用法ps 123456 dj ps make password ps,none,pbkdf2 sha256 建立django密碼,...

python學習 模組

time import time time.ctime 獲取當前時間的字串 time.localtime 返回值是strcut time型別的物件 st time.localtime st.tm yday 現在是今年第幾天 st.tm hour 現在是今天第幾個小時 st.tm mon 現在是今年的...