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)
廣告
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP