我有以下代码
import ctypes
pBuf = ctypes.cdll.msvcrt.malloc(nBufSize)
# wrote something into the buffer
如何使用Python 2.5将缓冲区的内容保存到文件中?
正如您可能已经知道的那样,这不起作用,给予TypeError: argument 1 must be string or read-only buffer, not int
:
f = open("out.data","wb"
f.write(pBuf)
答案 0 :(得分:3)
使用ctypes.create_string_buffer()
而不是malloc()
分配缓冲区可能会更好。在这种情况下,您可以通过buf.raw访问数据。
如果您需要访问malloc()
个数据,可以使用ctypes.string_at(address, size)
,mybe和强制转换为ctypes.c_void_p
或ctypes.c_char_p
,具体取决于您还有什么用途处理内存和包含的内容(\0
已终止的字符串或已知长度的数据。)
答案 1 :(得分:2)
将缓冲区转换为指向字节数组的指针,然后从中获取值。此外,如果您使用的是64位系统,则需要确保将malloc
的返回类型设置为c_void_p
(而非默认int
),以便返回值不会丢失任何位。
如果您的数据中存在嵌入的NUL,您还需要小心 - 您不能只将指针转换为c_char_p
并将其转换为字符串(如果将其转换为字符串,则尤其如此你的数据根本不是NUL终止的。)
malloc = ctypes.dll.msvcrt.malloc
malloc.restype = ctypes.c_void_p
pBuf = malloc(nBufSize)
...
# Convert void pointer to byte array pointer, then convert that to a string.
# This works even if there are embedded NULs in the string.
data = ctypes.cast(pBuf, ctypes.POINTER(ctypes.c_ubyte * nBufSize))
byteData = ''.join(map(chr, data.contents))
with open(filename, mode='wb') as f:
f.write(byteData)