【问题标题】:How to do a memset with Python buffer object?如何使用 Python 缓冲区对象进行 memset?
【发布时间】:2012-01-06 10:34:55
【问题描述】:

如何对 Python 缓冲区对象中的一组连续值进行快速重置?

主要是我在寻找 memset :)

PS。该解决方案应适用于 Python 2.5 并修改缓冲区本身(无副本)。

【问题讨论】:

  • 如何创建缓冲区对象?
  • 它由 WxImage.GetDataBuffer() 返回,你可以使用buf[0]=chr(0) 写入它,但我想快速写入一整套值,而不是使用 for 循环。
  • 只是一个评论.. memset 在处理加密敏感数据时可能很有用。示例:明文密码加密后销毁。 delling 名称或将其绑定到另一个对象是不够的;明文对象在被垃圾回收之前仍然可以在内存中保留一段时间。

标签: python wxpython buffer python-2.5


【解决方案1】:

如果你只想将值设置为零,你可以使用这个:

size = ...
buffer = bytearray(size)

或者可能:

buffer[:] = bytearray(size)

【讨论】:

    【解决方案2】:

    ctypes 包有一个内置的 memset 函数。ctypes 确实适用于 Python 2.5,但默认情况下不包括在内。您需要单独安装。

    def memsetObject(bufferObject):
        "Note, dangerous"
        import ctypes
        data = ctypes.POINTER(ctypes.c_char)()
        size = ctypes.c_int()  # Note, int only valid for python 2.5
        ctypes.pythonapi.PyObject_AsCharBuffer(ctypes.py_object(bufferObject), ctypes.pointer(data), ctypes.pointer(size))
        ctypes.memset(data, 0, size.value)
    
    testObject = "sneakyctypes"
    memsetObject(testObject)
    print repr(testObject)
    # '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
    

    【讨论】:

      【解决方案3】:

      如果你能写进去,试试itertools.repeat()

      import itertools
      my_buffer[:] = itertools.repeat(0, len(my_buffer))
      

      【讨论】:

      • 方括号内的: 是什么意思?
      • @shuva 那些: 表示我们将现有缓冲区作为迭代器(缓冲区的所有元素)并用新创建的元素替换它们。它将替换my_buffer的内容
      猜你喜欢
      • 2021-03-02
      • 2013-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-27
      • 1970-01-01
      相关资源
      最近更新 更多