代码之家  ›  专栏  ›  技术社区  ›  mdm

对于python的结构模块,什么是合适的缓冲区

  •  9
  • mdm  · 技术社区  · 16 年前

    在python中,我通过将二进制文件读取为字符串,然后使用 struct.unpack(...) . 现在我想用 struct.pack_into(...) 但是我得到了错误 “不能将字符串用作可修改缓冲区” . 什么样的缓冲区适合与 struct 模块?

    3 回复  |  直到 16 年前
        1
  •  6
  •   Mark Rushakoff    16 年前

    如果您不想将其打包到特定对象中,只需使用 struct.pack 返回字符串。

    否则, ctypes.create_string_buffer 是获得可变缓冲区的一种方法。

        2
  •  7
  •   Ned Deily    16 年前

    如另一个答案所述, struct_pack 可能是你所需要和应该使用的。但是,类型的对象 array 支持缓冲协议,可以修改:

    >>> import array, struct
    >>> a = array.array('c', ' ' * 1000)
    >>> c = 'a'; i = 1
    >>> struct.pack_into('ci', a, -0, c, i)
    >>> a
    array('c', 'a\x00\x00\x00\x01\x00\x00\x00  ...
    

    最初的缓冲区协议主要是针对C扩展的一点攻击。它已被否决并替换为 new C-level buffer API and memoryview objects 在python 3中(在即将到来的2.7中)。

        3
  •  -1
  •   steveha    16 年前

    有两种可能会立即想到:

    • 你可以用蟒蛇 stringio 使用文件语义生成读/写缓冲区的模块。

    • 你可以用蟒蛇 array 模块获取一个缓冲区,您可以将其视为一个列表,但只包含二进制字节。