有的時候需要用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上面的格式字串中,!表示我們要使用網路位元組順序解析,因為我們的資料是從網路中接收到的,在網路上傳送的時候它是網路位元組順序的.後面的h表示乙個unsigned short的id,4s表示4位元組長的字串,2i表示有兩個unsigned int型別的資料.struct
id, tag, version, count
=struct.unpack(
"!h4s2i
", s)
就通過乙個unpack,現在id, tag, version, count裡已經儲存好我們的資訊了.
同樣,也可以很方便的把本地資料再pack成struct格式.
sspack函式就把id, tag, version, count按照指定的格式轉換成了結構體header,ss現在是乙個字串(實際上是類似於c結構體的位元組流),可以通過socket.send(ss)把這個字串傳送出去.=struct.pack(
"!h4s2i
", id, tag, version, count);
**:
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...