python之struct 模組詳解

2021-10-16 12:44:18 字數 4894 閱讀 4707

準確地講,python沒有專門處理位元組的資料型別。但由於b'str'可以表示位元組,所以,位元組陣列=二進位制str。而在c語言中,我們可以很方便地用struct(結構體)、union來處理位元組,以及位元組和int,float的轉換。

在python中,比方說要把乙個32位無符號整數變成位元組,也就是4個長度的bytes,你得配合位運算子這麼寫:

>>

> n =

10240099

>>

> b1 =

(n &

0xff000000

)>>

24>>

> b2 =

(n &

0xff0000

)>>

16>>

> b3 =

(n &

0xff00

)>>

8>>

> b4 = n &

0xff

>>

> bs =

bytes

([b1, b2, b3, b4]

)>>

> bs

b'\x00\x9c@c'

非常麻煩。並且有的時候需要用python處理二進位制資料,比如,訪問檔案,socket操作時.這時候,可以使用python的struct模組來完成.可以用 struct來處理c語言中的結構體.

所以python提供了乙個struct模組來解決bytes和其他二進位制資料型別的轉換。

struct模組可以將任意大小的數字轉換成乙個固定長度(可選擇)的bytes, 這個原理類似於hash演算法, 不論內容多大, 最終的hash值長度不變, 不同的是hash演算法是不可逆的, 而且傳入的原材料可以是文字、字串等許多資料型別,struct可以反解出原來的資料

ps :struct模組只能轉換數字, 不能轉換其他的資料型別

struct模組中最重要的三個函式是pack(),unpack(),calcsize()函式

return

explain

pack(fmt,v1,v2…)

string

按照給定的格式(fmt),把資料轉換成字串(位元組流),並將該字串返回.

pack_into(fmt,buffer,offset,v1,v2…)

none

按照給定的格式(fmt),將資料轉換成字串(位元組流),並將位元組流寫入以offset開始的buffer中.(buffer為可寫的緩衝區,可用array模組)

unpack(fmt,v1,v2……)

tuple

按照給定的格式(fmt)解析位元組流,並返回解析結果

pack_from(fmt,buffer,offset)

tuple

按照給定的格式(fmt)解析以offset開始的緩衝區,並返回解析結果

calcsize(fmt)

size of fmt

計算給定的格式(fmt)占用多少位元組的記憶體,注意對齊方式

format

格式化字串。

size

結構體的大小。

為了同c中的結構體交換資料,還要考慮有的c或c++編譯器使用了位元組對齊,通常是以4個位元組為單位的32位系統,故而struct根據本地機器位元組順序轉換.可以用格式中的第乙個字元來改變對齊方式.定義如下:

character 字元

byte order 位元組順序

size大小

alignment對齊方式

@native按原位元組native按原位元組native按原位元組

=native按原位元組standard標準none 無

<little-endian小端standard 標準

none 無

>big-endian大端standard 標準

none 無

!network (= big-endian) 網路(=大端)

standard 標準

none 無

使用方法是放在format的第乙個位置,就像@5s6sif

字元(format)

ctype c語言型別

python type python型別

standard size 標準大小

xpad byte

no value

cchar

string of length 11b

signed char

integer1b

unsigned char

integer1?

_bool

bool1h

short

integer2h

unsigned short

integer2i

intinteger

4i(大寫i)

unsigned int

integer

4l(小寫l)

long

integer4l

unsigned long

integer4q

long long

integer8q

unsigned long long

integer8f

float

float4d

double

float8s

charl

string

pcharl

string

pvoid*

integer

注意:

_bool在c99中定義,如果沒有這個型別,則將這個型別視為char,乙個位元組;

q和q只適用於64位機器;

每個格式前可以有乙個數字,表示這個型別的個數,如s格式表示一定長度的字串,4s表示長度為4的字串;4i表示四個int;

p用來轉換乙個指標,其長度和計算機相關;

f和d的長度和計算機相關;

5.1、pack的基本用法:
>>

>

import struct

>>

> struct.pack(

'>i'

,10240099

)b'\x00\x9c@c'

pack的第乙個引數是處理指令,'>i'的意思是:

>表示位元組順序是big-endian,也就是網路序,i表示4位元組無符號整數。

後面的引數個數要和處理指令一致。

import struct

res = struct.pack(

"i",

1234566

)# 傳入的必須是 int 型別

print

(res)

# b'\x86\xd6\x12\x00' (檢視內容)

print

(type

(res)

)# (檢視型別)

res2 = struct.unpack(

"i",res)

# 使用什麼 format 打包就用什麼解包

print

(res2)

# (1234566,) (是個元組)

print

(type

(res2)

)# (檢視型別)

print

(res2[0]

)# 1234566

錯誤示例
import struct

res=struct.pack(

"i",

"淘小欣"

)'''

丟擲異常:struct.error: required argument is not an integer(引數必須是整數)

'''

5.2、unpack基本使用
>>

> struct.unpack(

'>ih'

, b'\xf0\xf0\xf0\xf0\x80\x80')(

4042322160

,32896

)

根據>ih的說明,後面的bytes依次變為i:4位元組無符號整數和h:2位元組無符號整數。

所以,儘管python不適合編寫底層操作位元組流的**,但在對效能要求不高的地方,利用struct就方便多了。

錯誤示例:

import struct

res = struct.pack(

"i",

123)

res2 = struct.unpack(

"q",res)

# struct.error: unpack requires a buffer of 8 bytes

python內建模組之struct

1.python提供了乙個struct模組來解決bytes和其他二進位制資料型別的轉換。struct的pack函式把任意資料型別變成bytes import struct print struct.pack i 10240099 執行結果 c program files python36 pytho...

Python 之struct模組解釋

最近學習了python的網路程式設計,網路程式設計用到的作業系統知識很多,還是很有必要先把作業系統必要知識複習一遍了,雖然我系統的學過一次但是還是太久沒看了忘記了,記下來就讓我們講一下struct吧 1 按照指定格式將python資料轉換為字串,該字串為位元組流,如網路傳輸時,不能傳輸int,此時先...

Python標準庫 struct模組

將位元組打包為二進位制資料。struct模組負責python bytes物件在python value及c struct之間的轉換。可以處理檔案二進位制資料 網路連線資料流或是其他源資料。它使用 format strings作為c結構布局的簡潔描述以及與python值的預期轉換。第乙個format ...