📜  Python中的结构模块

📅  最后修改于: 2022-05-13 01:54:19.642000             🧑  作者: Mango

Python中的结构模块

该模块执行Python值和表示为Python字节对象的 C 结构之间的转换。格式字符串是用于在打包和解包数据时指定预期布局的机制。模块结构在Python 3.x 中可用,在 2.x 中不可用,因此这些代码将在 Python3 解释器上运行。

结构函数

  • struct.pack()
    Syntax: 
    struct.pack(format, v1, v2, ...)

    返回包含根据给定格式打包的值 v1、v2、... 的字符串(格式字符串是用于在打包和解包数据时指定预期布局的机制)。格式后面的值必须按照仅格式,否则会引发 struct.error。

    import struct
      
    # Format: h is short in C type
    # Format: l is long in C type
    # Format 'hhl' stands for 'short short long'
    var = struct.pack('hhl',1,2,3)
    print(var)
      
    # Format: i is int in C type
    # Format 'iii' stands for '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()
    Syntax:
    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() return a tuples
    # Variables V1, V2, V3,.. are returned as elements of tuple
    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()
    Syntax:
    struct.calcsize(fmt)
    fmt: format 

    返回与给定格式对应的结构体(以及字符串)的大小。 calcsize() 是一个重要的函数,对于 struct.pack_into() 和 struct.unpack_from() 等函数是必需的,它们也需要偏移值和缓冲区。

    import struct
    var = struct.pack('?hil', True, 2, 5, 445)
    print(var)
    # Returns the size of the structure
    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()
    Syntax:
    struct.pack_into(fmt, buffer, offset, v1, v2, ...)
    fmt: data type format
    buffer: writable buffer which starts at offset (optional)
    v1,v2.. : values 
  • struct.unpack_from()
    Syntax:
    struct.unpack_from(fmt, buffer[,offset = 0])fmt: data type format
    buffer: writable buffer which starts at offset (optional)

    返回一个元组,类似于 struct.unpack()

    import struct
      
    # ctypes in imported to create string buffer
    import ctypes
      
    # SIZE of the format is calculated using calcsize()
    siz = struct.calcsize('hhl')
    print(siz)
      
    # Buffer 'buff' is created
    buff = ctypes.create_string_buffer(siz)
      
    # struct.pack() returns packed data
    # struct.unpack() returns unpacked data
    x = struct.pack('hhl', 2, 2, 3)
    print(x)
    print(struct.unpack('hhl', x))
      
    # struct.pack_into() packs data into buff, doesn't return any value
    # struct.unpack_from() unpacks data from buff, returns a tuple of values
    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)