Питон:Извлечение данных из буфера с помощью ctypes

StackOverflow https://stackoverflow.com/questions/1578752

  •  21-09-2019
  •  | 
  •  

Вопрос

Я могу успешно вызвать функцию с ctypes в Python.Теперь у меня есть буфер, заполненный структурами данных, которые я хочу извлечь.Какова лучшая стратегия для этого?Что-нибудь еще, что я должен опубликовать?

Функция:

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>

Это было полезно?

Решение

Интересно, почему вы используете os.stat() вместо вызова statinfo и os.path.walk() вместо вызова getdirentries?

Обычно, когда у вас есть буферы данных, которые вы хотите передавать в C и из него, для этого вы должны использовать методы упаковки и распаковки модулей структуры.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top