代码之家  ›  专栏  ›  技术社区  ›  Jeff L

操作字节列表时使用pack_into()的替代方法?

  •  2
  • Jeff L  · 技术社区  · 15 年前

    我正在将一个二进制文件读入一个列表并解析二进制数据。我使用unpack()提取数据的某些部分作为原始数据类型,我想编辑这些数据并将其插入到原始字节列表中。使用 pack_into() 这很容易,只是我使用的是python 2.4,直到2.5才引入pack ounto()。

    有人知道用这种方式序列化数据的好方法吗?这样我就可以完成与pack_into()基本相同的功能。

    2 回复  |  直到 15 年前
        1
  •  4
  •   Scott Griffiths    15 年前

    你看过吗 bitstring 模块?它旨在使二进制数据的构造、解析和修改比使用 struct array 模块直接。

    它特别适用于位级别的工作,但也适用于字节。它还可以与Python2.4一起使用。

    from bitstring import BitString
    s = BitString(filename='somefile')
    
    # replace byte range with new values
    # The step of '8' signifies byte rather than bit indicies.
    s[10:15:8] = '0x001122'
    
    # Search and replace byte value with two bytes
    s.replace('0xcc', '0xddee', bytealigned=True)
    
    # Different interpretations of the data are available through properties
    if s[5:7:8].int > 1000:
        s[5:7:8] = 1000
    
    # Use the bytes property to get back to a Python string
    open('newfile', 'wb').write(s.bytes)
    

    存储在 BitString 只是一个 数组 对象,但具有一套综合的功能和特殊的方法,使其易于修改和解释。

        2
  •  1
  •   Glenn Maynard    15 年前

    您的意思是在缓冲区对象中编辑数据吗?直接从python操作这些内容的文档相当少。

    如果您只想编辑字符串中的字节,这就足够简单了;struct.pack对于2.5来说是新的,但是struct.pack不是:

    import struct
    s = open("file").read()
    ofs = 1024
    fmt = "Ih"
    size = struct.calcsize(fmt)
    
    before, data, after = s[0:ofs], s[ofs:ofs+size], s[ofs+size:]
    values = list(struct.unpack(fmt, data))
    values[0] += 5
    values[1] /= 2
    data = struct.pack(fmt, *values)
    s = "".join([before, data, after])