Лучший способ сопоставить структуру C в python?

#python #c #serialization #struct

#питон #c #сериализация #структура

Вопрос:

У меня есть конечная точка API, которая принимает двоичную структуру на сервере, написанном на C . Конечная точка должна принимать сотни этих структур в секунду, поэтому использование JSON или чего-то подобного требует слишком больших затрат.

Структура выглядит примерно так:

 struct TX {  int blockId;  char signature[64];  char signingKey[32];  time_t timestamp;  char nonce[8];  char to[25];  char from[25];  long amount;  long fee;  bool isTransactionFee; };   

Я пишу клиент на Python, который должен отправлять данные в указанном выше формате. Когда я делаю sizeof в структуре на C , это дает мне 200 байт, сумма значений отдельных полей sizeof где — то ближе к 182 байтам.

Я не уверен, с чего начать с точки зрения возможности точной сериализации структур в python-Предполагаю ли я, что дополнение к структуре всегда добавляется в конец? Откуда мне знать, что между одним из двух полей нет заполнения?

Я написал что-то в этом роде, чтобы начать работу и запланировать копирование данных в эти bytearray:

 txBinary = bytearray([0]*200)  blockId = bytearray([0]*4)  signature = bytearray([0]*64)  signingKey = bytearray([0]*32)  timestamp = bytearray([0]*8)  nonce = bytearray([0]*8)  toWallet = bytearray([0]*25)  fromWallet = bytearray([0]*25)  amount = bytearray([0]*8)  fee = bytearray([0]*8)  isFee = bytearray([0])  

Является ли это разумным подходом? Есть ли какой-нибудь другой более простой способ сериализации структуры данных, подобной этой, в Python?

Ответ №1:

Поэтому после долгих размышлений я решил, что наиболее надежный способ сделать это-использовать exec из Python для вызова приложения C cli, которое принимает параметры транзакции и выводит версию структуры в кодировке base64.

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