#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.