如何将通过ctype malloc分配的二进制缓冲区保存到Python中的文件中?

时间:2011-10-20 14:56:22

标签: python windows

我有以下代码

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)

2 个答案:

答案 0 :(得分:3)

使用ctypes.create_string_buffer()而不是malloc()分配缓冲区可能会更好。在这种情况下,您可以通过buf.raw访问数据。

如果您需要访问malloc()个数据,可以使用ctypes.string_at(address, size),mybe和强制转换为ctypes.c_void_pctypes.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)