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

2021-06-11 23:25:21 字數 2420 閱讀 5394

python中沒有二進位制型別,但是可以使用string字串型別來儲存二進位制資料,然後使用struct模組來對二進位制資料進行處理。下面將詳細描述如何使用struct模組來處理二進位制資料。

使用struct.pack把乙個整數值打包成字串,開啟python命令列,輸入:

>>>import struct

>>> a =0x01020304

>>> str= struct.pack("i", a)

>>>repr(str)

"'\\x04\\x03\\x02\\x01'"

此時,str為乙個字串,字串中的內容與整數a的二進位制儲存的內容相同。

使用struct.unpack把字串解包成整數型別,如下:

>>> b =struct.unpack("i", str)

>>> b

(16909060,)

在解包之後,返回乙個元組型別(tuple)的資料。

如果多個資料進行打包,可以在格式中指定打包的資料型別,然後資料通過引數傳入:

>>> a ="hello"

>>> b ="world!"

>>> c =2

>>> d =45.123

>>> str= struct.pack("5s6sif", a, b, c, d)

等價於: struct.pack_into(「5s6sif」,str,  0, a, b, c, d)

>>> str

'helloworld!\x00\x02\x00\x00\x00\xf4}4b'

解包多個資料可以這樣做:

>>>parts = struct.unpack("5s6sif", str)

等價於:  struct.unpack_from(「5s6sif」, str, 0)

>>>parts

('hello','world!', 2, 45.12300109863281)

從上可以看到浮點值在解包後與原來值不一樣,這是因為浮點數的精度問題導致的。

struct模組中二進位制格式化表示

格式c型別

python型別

位元組數x

填充位元組無值c

char

長度為1的字串

bsigned char整型b

unsigned char

整型_bool

bool

hshort整型h

unsigned short整型i

int整型

iunsigned int整型l

long整型l

unsigned long整型q

long long 整型q

unsigned long long 整型f

float

浮點數d

double

浮點數s

char

字串p

char

字串p

void *

long

最後乙個可以用來表示指標型別,佔4個位元組(32位),8個位元組(64位)。

為了在與不同硬體結構之間交換資料,需要考慮位元組序,如下:

字元位元組序

大小和對齊

本機位元組序

本機,本機4位元組對齊

本機位元組序

標準,按原位元組數對齊

小尾位元組序

標準,按原位元組數對齊

大尾位元組序

標準,按原位元組對齊

網路位元組序(大尾)

標準,按原位元組對齊

注:預設的情況下,使用本機位元組序(同@),可以通過上面的字元修改位元組序。

計算格式字串的大小函式:struct.calcsize(fmt)

>>>struct.calcsize("ihi")                       預設為4位元組對齊時,長度為12

>>>struct.calcsize("iih")                            當h在最後的時(此時不4位元組對齊),長度為10

10

>>>struct.calcsize("@ihi")

>>>struct.calcsize("=ihi")

>>>struct.calcsize(">ihi")

>>>struct.calcsize(">>>struct.calcsize("!ihi")

注:二進位制檔案開啟/讀取的時候需要使用「rb」/「wb」模式以二進位制方式開啟/讀取檔案。

注:關於le(little-endian)和be(big-endian)區別:

le—最符合人的思維的位元組序,位址低位儲存值的低位,位址高位儲存值的高位。

be—最直觀的位元組序,位址低位儲存值的高位,位址高位儲存值的低位。

例如:雙字0x01020304在記憶體中儲存方式,le=0403 02 01,be=01 02 03 04。

4 二進位制資料處理庫

二進位制處理庫主要是針對二進位制資料的操作和使用,也有介紹一些特定的操作,比如像檔案格式和網路協議。在前面也介紹了文字處理庫,其實有一部分功能也是能處理二進位制資料的,比如正規表示式re,或者是difflib比較庫對資料進行處理。此外,在python內部也提供了bytes bytearray mem...

python處理二進位制資料

處理二進位制資料離不開python的struct模組,struct理解上你可以把它理解為c語言的結構體,使用該模組的pack和unpack方法,可以很容易的把二進位制資料轉換為常用的型別資料,如整型 字元型等 結構體如下 struct header 將二進位制資料流解析為常用的資料型別,例如 pyt...

python中二進位制 Python中的二進位制樹

這是我在 python中實現二叉樹實現的 片段.這在執行preorder函式時起作用.class node def init self,data self.left none self.right none self.data data class binarytree node def init ...