Skip to content

Instantly share code, notes, and snippets.

@turbanoff
Last active February 23, 2016 23:32
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save turbanoff/859285e2caac5f8af5c9 to your computer and use it in GitHub Desktop.
Save turbanoff/859285e2caac5f8af5c9 to your computer and use it in GitHub Desktop.

Я немного разобрался со 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))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment