Python 二進位制資料服務


Python 庫中 `struct` 模組的規定在執行 C 型別結構體和 Python 位元組物件之間的轉換方面非常有用。這可以透過模組級函式以及 `struct` 模組中定義的 `Struct` 類及其方法來實現。

轉換函式使用格式字串。格式字串中使用的位元組順序、大小和對齊方式由格式字元確定,如下表所示

字元
位元組順序
大小
對齊
@
原生
原生
原生
=
原生
標準

<
小端序
標準

>
大端序
標準

!
網路位元組序(= 大端序)
標準

下表顯示了用於表示 C 型別變數和相應 Python 型別的格式字元。

格式
C 型別
Python 型別
x
填充位元組
無值
c
char
長度為 1 的位元組
b/B
有符號/無符號 char
整數
?
_Bool
bool
h/H
short/unsigned short
整數
i/I
int/unsigned int
整數
l/L
long/unsigned long
整數
f
float
float
d
double
float
s
char[]
bytes
p
char[]
bytes
P
void *
整數

`struct` 模組中定義了以下函式

pack()

此函式返回一個位元組物件,其中包含根據格式字串 `format` 打包的值。格式字元必須與格式所需的值匹配。

unpack()

此函式根據格式字串 `format` 從緩衝區解包。即使結果只包含一項,它也是一個元組。

以下程式碼演示了這些函式的使用。

import struct
student=(1, b'Rahul', 65.75)
packed=struct.pack('I 5s f', *student)
print ('packed data:',packed)

unpacked=struct.unpack('I 5s f', packed)
print ('unpacked data:',unpacked)

輸出

packed data: b'\x01\x00\x00\x00Rahul\x00\x00\x00\x00\x80\x83B'
unpacked data: (1, b'Rahul', 65.75)

也可以使用 `Struct` 類中的方法來實現打包/解包。建立一次 `Struct` 物件並呼叫其方法比使用相同格式呼叫 `struct` 函式更有效,因為格式字串只需要編譯一次。

Struct(format)

此建構函式返回一個新的 `Struct` 物件,該物件根據格式字串 `format` 寫入和讀取二進位制資料。

pack()

此方法與 `pack()` 函式相同,使用已編譯的格式。

unpack()

此方法與 `unpack()` 函式相同,使用已編譯的格式。

以下示例顯示瞭如何使用 `Struct` 類打包和解包 Python 資料。

s = struct.Struct('I 5s f')
packed=s.pack(*student)
print (packed)
unpacked = s.unpack(packed)
print (unpacked)

打包後的資料可以直接解析為命名元組物件。

from collections import namedtuple
newstudent = namedtuple('newstudent','No Name Marks')
s1 = newstudent._make(struct.unpack('I 5s f', packed))
print (s1)

輸出

newstudent(No=1, Name=b'Rahul', Marks=65.75)

更新於:2019年7月30日

325 次瀏覽

啟動您的職業生涯

完成課程獲得認證

開始
廣告
© . All rights reserved.