【问题标题】:Python: Extracting data from buffer with ctypesPython:使用 ctypes 从缓冲区中提取数据
【发布时间】: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


【解决方案1】:

我想知道你为什么使用 os.stat() 而不是调用 statinfo 和 os.path.walk() 而不是调用 getdirentries?

通常,当您有要传入和传出 C 的数据缓冲区时,您会使用 struct modules 的 pack 和 unpack 方法来执行此操作。

【讨论】:

  • 我对实际检查目录条目本身而不是遍历目录感兴趣。至于 os.stat,我正在使用 os.fstat,因为 FD 已经打开。是否有更好的方法来确定目录条目的大小?谢谢!
  • “目录大小”是什么意思?您是指用于存储目录数据的字节数,目录中的条目数,还是用于存储目录中所有非目录条目的总字节数?对于最后一个,请参阅code.activestate.com/recipes/86554 了解一些想法。我不确定它是否可以正常处理链接,即在类 unix 系统上具有相同 i-node 编号的两个文件,但对于 Windows,这不是问题。除了遍历每个条目并总结文件大小之外,没有更好的方法来获取目录中所有文件的总字节数。
  • 用于存储目录数据的字节数。
  • 我使用 unpacked 和 ctypes 结构来存储数据(这有点多余,但很好)。效果很好,感谢您的建议!
猜你喜欢
  • 1970-01-01
  • 2021-11-21
  • 2013-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-09
相关资源
最近更新 更多