Как сохранить двоичный буфер, выделенный с помощью ctype malloc, в файл на Python? - PullRequest
1 голос
/ 20 октября 2011

У меня есть следующий код

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 ]

3 голосов
/ 20 октября 2011

Может быть, лучше было бы выделить буфер с ctypes.create_string_buffer() вместо malloc().В этом случае у вас есть доступ к данным через buf.raw.

Если вам нужен доступ к malloc() редактированным данным, вы можете сделать это с помощью ctypes.string_at(address, size), mybe в сочетании сприведение к ctypes.c_void_p или ctypes.c_char_p, в зависимости от того, что еще вы делаете с памятью и что в ней содержится (\0 завершенная строка или данные с известной длиной).

2 голосов
/ 20 октября 2011

Приведите буфер в указатель к байтовому массиву, а затем получите значение из этого.Кроме того, если вы работаете в 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...