用struct模組處理二進位制資料

2021-06-22 05:06:44 字數 1993 閱讀 9033

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

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

pack(fmt, v1, v2, ...)    按照給定的格式(fmt),把資料封裝成字串(實際上是類似於c結構體的位元組流)

unpack(fmt, string)       按照給定的格式(fmt)解析位元組流string,返回解析出來的tuple

calcsize(fmt)             計算給定的格式(fmt)占用多少位元組的記憶體

struct中支援的格式如下表:

> 格式 c型別 python型別 

> x char 無(表示填充位元組) 

> c char 長度為1的字串 

> b signed char integer 

> b unsigned char integer 

> h short integer 

> h unsigned short integer 

> i int integer 

> i unsigned int 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* integer

注1.q和q只在機器支援64位操作時有意思

注2.每個格式前可以有乙個數字,表示個數

注3.s格式表示一定長度的字串,4s表示長度為4的字串,但是p表示的是pascal字串

注4.p用來轉換乙個指標,其長度和機器字長相關

預設情況下struct根據本地機器位元組順序轉換.不過可以用格式中的第乙個字元來改變對齊方式.定義如下:

> 字元 位元組順序 長度和對齊方式 

> @ native native 

> = native standard 

> < little-endian standard 

> > big-endian standard 

> ! network (= big-endian) standard

有了struct,我們就可以很容易操作二進位制資料了.

比如有乙個結構體:

struct header

通過socket.recv接收到了乙個上面的結構體資料,存在字串s中,現在需要把它解析出來,可以使用unpack()函式.

import

struct

id, tag, version, count

=struct.unpack(

"!h4s2i

", s)

上面的格式字串中,!表示我們要使用網路位元組順序解析,因為我們的資料是從網路中接收到的,在網路上傳送的時候它是網路位元組順序的.後面的h表示乙個unsigned short的id,4s表示4位元組長的字串,2i表示有兩個unsigned int型別的資料.

就通過乙個unpack,現在id, tag, version, count裡已經儲存好我們的資訊了.

同樣,也可以很方便的把本地資料再pack成struct格式.

ss 

=struct.pack(

"!h4s2i

", id, tag, version, count);

pack函式就把id, tag, version, count按照指定的格式轉換成了結構體header,ss現在是乙個字串(實際上是類似於c結構體的位元組流),可以通過socket.send(ss)把這個字串傳送出去.

**:

struct處理二進位制

忍不住搬運了,感謝原作者 有的時候需要用python處理二進位制資料,比如,訪問檔案,socket操作時.這時候,可以使用python的struct模組來完成.可以用 struct來處理c語言中的結構體.struct模組中最重要的三個函式是pack unpack calcsize pack fmt,...

Python模組struct 二進位制資料服務

python沒有專門處理位元組的資料型別。但由於b str 可以表示位元組,所以,位元組陣列 二進位制str。而在c語言中,我們可以很方便地用struct union來處理位元組,以及位元組和int,float的轉換。在python中,比方說要把乙個32位無符號整數變成位元組,也就是4個長度的byt...

Python使用struct處理二進位制

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