📜  Python中的struct模块

📅  最后修改于: 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
  • 注意:格式字符的顺序可能会影响大小。
  • 异常struct.error
    异常struct.error描述了传递错误参数时出了什么问题,当传递了错误参数,抛出struct.error时:
    from struct import error
    print(error)
  • 注意:这段代码在异常处理以外的任何地方都没有用,用于在解释类时显示“错误”。
  • struct.pack_into(),语法:
    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)