Я немного разобрался со struct:
- Строка с форматом должна быть в бинарном виде, поэтому всегда пишется b в начале
- Потом в кавычках идёт сам формат
- Формат начинается с < - это порядок байтов (можно не обращать внимание и всегда писать <)
- Дальше идёт само описание типов данных. Вот тут есть табличка с ними - https://docs.python.org/3.5/library/struct.html
Пример:
AERMagic = struct.Struct(b'<4s2H')
Судя по описанию формата ddd это соответствует заголовку
struct Нeader { // Заголовок файла
UINT32 magic; // Идентификатор файла (всегда равен 0x52454121 или '!AER')
UINT16 version; // Версия формата (пока 0)
UINT16 headersize; // Длина заголовка (сейчас 126 байт)
4s
- это 4 символа (то есть 4 байта). Соответствует UINT32 magic
2H
- это два числа (по два байта каждый). Соответствует UINT16 version
и UINT16 headersize
AERHeader = struct.Struct(AERMagic.format +
bytes('{}s'.format(AERTable.size), 'ascii')*3 + b'L')
3 раза AERTable
(freq, phi, theta) + L
(data_offset)
struct ValueSet freq; // Описатель шкалы частот, Гц
struct ValueSet phi; // Описатель шкалы углов по "долготе", градусы
// измеряется от оси X в направлении Y (Z - ось антенны)
struct ValueSet theta; // Описатель шкалы углов по "широте", градусы
// измеряется от оси Z в направлении плоскости XY
UINT32 data_offset; // Начало данных напряженности поля
Каждая из этих стуртур ValueSet описана в виде формата
AERTable = struct.Struct(b'<H3dL')
struct ValueSet { // Описатель шкалы
UINT16 count; // Число значений
double begin; // Начальное значение (Минимальное в таблице)
double end; // Конечное значение (Максимальное в таблице)
double step; // Шаг* (д. б. равен (End - Begin)/(Count - 1))
UINT32 table_offset; // Смещение начала таблицы (=0 - нет) float[count]
};
H
- два байта, соответсвует UINT16 count
3d
- 3 double. соответвует begin
, end
, step
L
- соответствует UINT32 table_offset
magic, version, hsize, t1, t2, t3, dataoffset = \
AERHeader.unpack(f.read(hsizemin))