我想在Windows下的Python 2.5中获取一个内存块的文件对象。(由于某些原因,我无法使用较新的版本来执行此任务。)
作为输入,我确实有pointer
和size
,我们假设我只需要只读访问。
如果你想知道,我通过使用ctypes得到了这些,我需要让它们可用于需要文件处理程序的函数(只读)。
我考虑使用cStringIO
但是为了创建这样的对象,我需要一个string
对象。
答案 0 :(得分:6)
你应该在那里使用ctypes。从已经在标准库中的Python 2.5 ctypes开始,对你来说是一个“胜利”的情况。
使用ctypes,你可以构造一个代表更高级别的pointe的python对象:
import ctypes
integer_pointer_type = ctypes.POINTER(ctypes.c_int)
my_pointer = integer_pointer_type.from_address(your_address)
然后,您可以将内存内容作为Python索引对象来处理,例如 print my_pointer [0]
这不会给你一个“类似接口的文件” - 虽然用这种对象包装一个带有“read”和“seek”方法的类是微不足道的:
class MyMemoryFile(object):
def __init__(self, pointer, size=None):
integer_pointer_type = ctypes.POINTER(ctypes.c_uchar)
self.pointer = integer_pointer_type.from_address(your_address)
self.cursor = 0
self.size = size
def seek(self, position, whence=0):
if whence == 0:
self.cursor = position
raise NotImplementedError
def read(size=None):
if size is None:
res = str(self.pointer[cursor:self.size])
self.cursor = self.size
else:
res = str(self.pointer[self.cursor:self.cursor + size]
self.cursor += size
return res
(未经测试 - 如果不起作用,请写信给我 - 可以修复)
请注意,尝试读取超出为数据结构分配的空间的内存将与在C中执行此操作具有完全相同的效果:在大多数情况下,是分段错误。
答案 1 :(得分:1)
来自ctypes
文档,您可以使用the ctypes.string_at()
function从内存中的地址获取字符串。
问题是字符串不可变,这意味着您将无法从python中修改生成的字符串。要在python中使用可变缓冲区,您需要从python中调用ctypes.create_string_buffer()
function。