當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Python struct用法及代碼示例


該模塊執行之間的轉換Python值和 C 結構表示為 Python 字節對象。格式字符串是用於在打包和解包數據時指定預期布局的機製。 Module struct 在 Python 3.x 中可用,但在 2.x 中不可用,因此這些代碼將在 Python3 解釋器上運行。

Python 結構模塊

  • 結構體.pack()
  • 結構體.unpack()
  • 結構體.calcsize()
  • 結構體.pack_into()
  • 結構體.unpack_from()

Python 中的struct.pack

用法:
struct.pack(format, v1, v2, …)

Return a string containing the values v1, v2, … , that are packed according to the given format (Format strings are the mechanism used to specify the expected layout when packing and unpacking data).The values followed by the format must be as per the format only, else struct.error is raised.

Python 中的結構包示例

該代碼利用了struct將值打包成二進製數據的模塊。首先struct.pack() call 將值 1、2、3 打包為具有特定格式代碼的二進製數據(短整型為‘h’,長整型為‘l’),並將結果存儲在變量中var.這第二struct.pack() 調用嘗試以 ‘iii’ 格式打包三個 4 字節有符號整數,這可能會因可能超出範圍而引發錯誤。相應地打印打包的二進製數據或異常消息。

Python3


import struct
var = struct.pack('hhl',1,2,3)
print(var)
var = struct.pack('iii',1,2,3)
print(var)

輸出:

b'\x01\x00\x02\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00'
b'\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00'

Python 中的 struct.unpack()

用法:
struct.unpack(fmt, string)

Return the values v1, v2, … , that are unpacked according to the given format(1st argument). Values returned by this function are returned as tuples of size that is equal to the number of values passed through struct.pack() during packing. 

Python 中的結構解包示例

這段代碼展示了Python的使用struct使用指定格式代碼打包和解包二進製數據的模塊。它演示了將布爾值、整數、長整數和浮點值的組合打包為二進製數據,然後將它們解包。格式字符串中的格式代碼決定數據類型和大小,從而實現二進製和 Python 數據結構之間的精確數據轉換。

Python3


import struct
var = struct.pack('?hil', True, 2, 5, 445)
print(var)
tup = struct.unpack('?hil', var)
print(tup)
var = struct.pack('qf', 5, 2.3)
print(var)
tup = struct.unpack('qf', var)
print(tup)

輸出:

b'\x01\x00\x02\x00\x05\x00\x00\x00\xbd\x01\x00\x00\x00\x00\x00\x00'
(True, 2, 5, 445)
b'\x05\x00\x00\x00\x00\x00\x00\x0033\x13@'
(5, 2.299999952316284)

Note: ‘b’ in the Output stands for binary.

Python 中的 struct.calcsize()

Syntax: struct.calcsize(fmt)

  • fmt: format

Return the size of the struct (and hence of the string) corresponding to the given format. calcsize() is important function, and is required for function such as struct.pack_into() and struct.unpack_from(), which require offset value and buffer as well. 

Python 中的 struct calcsize 示例

示例 1:這段代碼使用Python的struct使用格式字符串將布爾值、整數和長整數值打包為二進製數據的模塊'?hil'。然後,它計算並打印該格式的打包二進製數據的大小(以字節為單位)。此外,它還計算並打印格式字符串的大小'qf',它表示一個 long long 整數,後跟一個浮點數。這說明了如何 struct.calcsize() 函數可用於根據格式字符串確定二進製數據表示的內存大小。

Python3


import struct
var = struct.pack('?hil', True, 2, 5, 445)
print(var)
print(struct.calcsize('?hil'))
print(struct.calcsize('qf'))

輸出:

b'\x01\x00\x02\x00\x05\x00\x00\x00\xbd\x01\x00\x00\x00\x00\x00\x00'
16
12

示例 2:該代碼利用了'struct'模塊使用格式字符串將數據打包為二進製格式。它演示了兩種場景,一種是標準整數和有符號整數按 ‘bi’ 的順序打包,另一種是順序顛倒為 ‘ib’。該代碼計算並打印每個格式字符串生成的二進製數據的大小(以字節為單位),展示數據類型的順序如何影響二進製表示形式和大小。

Python3


import struct
var = struct.pack('bi', 56, 0x12131415)
print(var)
print(struct.calcsize('bi'))
var = struct.pack('ib', 0x12131415, 56)
print(var)
print(struct.calcsize('ib'))

輸出:

b'8\x00\x00\x00\x15\x14\x13\x12'
8
b'\x15\x14\x13\x128'
5

Note: The ordering of format characters may have an impact on size.

異常struct.error

例外struct.error說明傳遞參數時的錯誤,當傳遞錯誤的參數時struct.error我s 提出。

PYTHON


from struct import error
print(error)

Note: This is piece of code is not useful, anywhere other than exception handling, and is used to show that ‘error’ upon interpreted shows about the class.

Python 中的 struct.pack_into()

用法:
struct.pack_into(fmt, buffer, offset, v1, v2, …)

fmt: data type format

buffer: writable buffer which starts at offset (optional)

v1,v2.. : values

Python 中的 struct.unpack_from()

Syntax: struct.unpack_from(fmt, buffer[,offset = 0])

fmt: data type format

buffer:writable buffer which starts at offset (optional)

Returns a tuple, similar to struct.unpack() 

Python 示例中的結構unpack_from

這段代碼使用Python的'struct''ctypes'處理二進製數據的模塊。它首先計算格式字符串所需的大小,創建該大小的字符串緩衝區,並使用指定的格式字符串打包和解包數據。該代碼演示了如何操作內存中的二進製數據,展示如何將數據打包到緩衝區或從緩衝區解包數據,以及如何利用'pack_into''unpack_from'訪問二進製內容的函數。

Python3


import struct
import ctypes
size = struct.calcsize('hhl')
print(siz)
buff = ctypes.create_string_buffer(siz)
x = struct.pack('hhl', 2, 2, 3)
print(x)
print(struct.unpack('hhl', x))
struct.pack_into('hhl', buff, 0, 2, 2, 3)
print(struct.unpack_from('hhl', buff, 0))

輸出:

16
b'\x02\x00\x02\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00'
(2, 2, 3)
(2, 2, 3)

參考https://docs.python.org/2/library/struct.html



相關用法


注:本文由純淨天空篩選整理自佚名大神的英文原創作品 struct module in Python。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。