【发布时间】:2009-10-16 15:20:59
【问题描述】:
我能够在 Python 中使用 ctypes 成功调用函数。我现在有一个缓冲区,里面装满了我要提取的数据结构。最好的策略是什么?还有什么我应该发布的吗?
功能:
class list():
def __init__(self):
#[...]
def getdirentries(self, path):
self.load_c()
self.fd = os.open(path, os.O_RDONLY)
self.statinfo = os.fstat(self.fd)
self.buffer = ctypes.create_string_buffer(self.statinfo.st_size)
nbytes = self.statinfo.st_size
transferred_bytes = self.libc.getdirentries(
self.fd,
ctypes.byref(self.buffer),
nbytes,
ctypes.byref(self.basep) )
#[...]
结构:
class dirent(ctypes.Structure):
_fields_ = [ ("d_fileno", ctypes.c_uint32), # /* file number of entry */
("d_reclen", ctypes.c_uint16), # /* length of this record */
("d_type", ctypes.c_uint8), # /* file type */
("d_namlen", ctypes.c_uint8), # /* length of string in d_name */
("d_name", ctypes.c_char * (MAXNAMELEN + 1) ) ]
一些输出:
传输字节数:156
缓冲区大小:272
缓冲区:<ctypes.c_char_Array_272 object at 0x8c3f0>
【问题讨论】:
-
如果我不清楚,缓冲区将在其中保存一些 dirent() 结构。我可以使用第一个 dirent.d_reclen 来确定 self.buffer 中第一个 dirent() 结构的大小。我也应该使用 self.basep 索引通过 lseek(3) 遍历结构。那么,我将如何获取第一个缓冲区条目?谢谢!
标签: python buffer extract ctypes