Как прочитать структуру, содержащую массив, используя Python ctypes и readinto? - PullRequest
6 голосов
/ 18 сентября 2009

У нас есть несколько двоичных файлов, созданных программой на Си.

Файл одного типа создается путем вызова fwrite для записи в файл следующей структуры C:

typedef struct {
   unsigned long int foo; 
   unsigned short int bar;  
   unsigned short int bow;

} easyStruc;

В Python я прочитал структуры этого файла следующим образом:

class easyStruc(Structure):
  _fields_ = [
  ("foo", c_ulong),
  ("bar", c_ushort),
  ("bow", c_ushort)
]

f = open (filestring, 'rb')

record = censusRecord()

while (f.readinto(record) != 0):
     ##do stuff

f.close()

Это отлично работает. Наш другой тип файла создается с использованием следующей структуры:

typedef struct {  // bin file (one file per year)
    unsigned long int foo; 
    float barFloat[4];  
    float bowFloat[17];
} strucWithArrays;

Я не уверен, как создать структуру в Python.

Ответы [ 2 ]

10 голосов
/ 18 сентября 2009

Согласно этой странице документации (раздел: 15.15.1.13. Массивы), это должно быть что-то вроде:

class strucWithArrays(Structure):
  _fields_ = [
  ("foo", c_ulong),
  ("barFloat", c_float * 4),
  ("bowFloat", c_float * 17)]

Проверьте эту страницу документации для других примеров.

2 голосов
/ 18 сентября 2009

В документации есть раздел о массивах в ctypes . В основном это означает:

class structWithArray(Structure):
    _fields_ = [
      ("foo", c_ulong),
      ("barFloat", c_float * 4),
      ("bowFloat", c_float * 17)
    ]
...