当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。