📅  最后修改于: 2020-04-10 00:52:59             🧑  作者: Mango
此模块在Python值和表示为Python字节对象的C结构之间执行转换。格式字符串是用于在打包和拆包数据时指定预期布局的机制。模块struct在Python 3.x中可用,而在2.x中不可用,因此这些代码将在Python3解释器上运行。
结构函数
struct.pack(),语法:
struct.pack(format, v1, v2, ...)
返回包含根据给定格式打包的值v1,v2,…的字符串(格式字符串是用于在打包和解包数据时指定所需布局的机制)。格式后面的值只能与格式一致,否则会引发struct.error。。
import struct
# 格式:h是C型的short
# 格式:l是C型的long
# 格式“ hhl"代表“ short short long"
var = struct.pack('hhl',1,2,3)
print(var)
# 格式:我是C型的int
# 格式“ iii"代表“ int int int"
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'
struct.unpack(),语法:
struct.unpack(fmt, string)
返回根据给定格式(第一个参数)拆包的值v1,v2,…。此函数返回的值以元组的形式返回,该元组的大小等于打包期间通过struct.pack()传递的值的数量。
import struct
# '?' -> _BOOL , 'h' -> short, 'i' -> int and 'l' -> long
var = struct.pack('?hil', True, 2, 5, 445)
print(var)
# struct.unpack()返回一个元组
# 变量V1,V2,V3,..作为元组的元素返回
tup = struct.unpack('?hil', var)
print(tup)
# q -> long long int and f -> float
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)
注意:输出中的“ b”代表二进制。
struct.calcsize(),语法:
struct.calcsize(fmt)
fmt: format
返回对应于给定格式的结构的大小(因此返回字符串的大小)。calcsize()是重要的函数,对于诸如struct.pack_into()和struct.unpack_from()之类的函数是必需的,它们也需要偏移值和缓冲区。
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
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
from struct import error
print(error)
struct.pack_into(fmt, buffer, offset, v1, v2, ...)
fmt: 数据类型格式
buffer: 从偏移量开始的可写缓冲区(可选)
v1,v2.. : values
struct.unpack_from(),语法:
struct.unpack_from(fmt, buffer[,offset = 0])
fmt: 数据类型格式
buffer:从偏移量开始的可写缓冲区(可选)
返回一个元组,类似于struct.unpack()
import struct
# 导入ctypes以创建字符串缓冲区
import ctypes
# 使用calcsize()计算格式的SIZE
siz = struct.calcsize('hhl')
print(siz)
# 缓冲区“ buff"已创建
buff = ctypes.create_string_buffer(siz)
# struct.pack()返回打包数据
# struct.unpack()返回解压的数据
x = struct.pack('hhl', 2, 2, 3)
print(x)
print(struct.unpack('hhl', x))
# struct.pack_into()将数据打包到buff中,不返回任何值
# struct.unpack_from()从buff拆包数据,返回值的元组
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)