Base64 кодирование сложного объекта в Python для передачи QR-кода - PullRequest
0 голосов
/ 05 мая 2019

У меня есть сложный объект (в частности, вывод метода build_send_kin в документации Kin Python SDK )

Мне нужно base64-кодировать этот объект Builder, поэтомуможно превратить в QR-код.QR-код будет подписан существующим и стандартизированным методом, поэтому я не думаю, что смогу каким-либо образом изменить объект Builder перед его кодированием в base64.Я пробовал несколько разных подходов, каждый со своими ошибками.Вот разбивка ключевых подходов, которые я использовал.

Чтобы начать, я просто хотел понять, что даст мне вывод метода build_send_kin, поэтому я запустил

    builder = account.build_send_kin( recipient, amount, fee=minimum_fee, memo_text=str( generate_uuid() ) )
print(builder)

это напечатано: <kin_base.builder.Builder object at 0x10fbb7e48>.Это похоже на указатель на пространство в памяти, которое содержит более сложную структуру данных.Более сложная структура данных - это то, к чему я стремлюсь кодировать с помощью base64.

Итак, во-первых, я попробовал непосредственно кодировать с помощью base-64:

    builder = account.build_send_kin( recipient, amount, fee=minimum_fee, memo_text=str( generate_uuid() ) )
    encoded_builder = base64.b64encode(builder)
    print(encoded_builder)

Это приводит к ошибке: a bytes-like object is required, not 'Builder'

, если я сначала пробую конструктор с преобразованием байтов, как показано ниже:

    builder = account.build_send_kin( recipient, amount, fee=minimum_fee, memo_text=str( generate_uuid() ) )
    encoded_builder = base64.b64encode( bytes(builder))
    print(encoded_builder)

Я получаю ошибку: cannot convert 'Builder' object to bytes.

Затем я попробовал другой подход напрямуюbase64-кодирование это;Я думал, что это может быть обработано с xdrlib.Чтобы понять, как может выглядеть распакованный объект Builder, я запустил:

    builder = account.build_send_kin( recipient, amount, fee=minimum_fee, memo_text=str( generate_uuid() ) )
    encoded_builder = xdrlib.Unpacker(builder)
    print(encoded_builder)

, который напечатал: <xdrlib.Unpacker object at 0x10ebb8dd8> - он по-прежнему выглядит как указатель на пробел в памяти, на этот раз распаковщик xdrlibобъект (я действительно ничего не знаю об объектах такого типа)

Задаваясь вопросом, может ли это быть закодировано в base-64, я попытался закодировать в base-64 объект распаковщика, что привело к: a bytes-like object is required, not 'Unpacker'

Я попытался преобразовать его в байты, как я это делал с исходным объектом Builder, но у меня была ошибка, аналогичная той, что была при попытке сделать это с объектом Builder.

Я также пытался распаковать xdr с помощью Unpacker.unpack_bytes() Unpacker.unpack_string() и Unpacker.unpack_opaque() и полученная ошибка: 'Builder' object is not subscriptable во всех трех случаях.Это дало мне понять, что JSON-кодирование, мои следующие амбиции, вероятно, также потерпит неудачу, но я попытался, тем не менее, использовать json.dumps с некоторым переформатированием здесь и там, что привело к ошибкам not subscriptable или другим подобным ошибкам, которые я виделдо.Аналогичные результаты при попытке засолки.

Я видел, что могут быть некоторые способы написания пользовательских сценариев для JSON-кодирования данных такого типа, но, поскольку мне понадобятся данные, чтобы сохранить их целостность при кодировании QRпоэтому его можно проанализировать и подписать мобильным устройством конечного пользователя, я не думаю, что смогу изменить эти данные.

Наконец, поскольку Kin построен на Stellar, я попытался этот ответ StackOverflow , но похоже, что объект Builder в Kin отличается от объекта транзакции в Stellar, поскольку он не предоставляет методы toEnvelope или toXDR.

В любом случае, поскольку объект Builder существует какПредставление байтов где-то в памяти, о чем свидетельствует его каноническое строковое представление <kin_base.builder.Builder object at 0x10fbb7e48>, я предполагаю, что должен быть какой-то простой способ QR-кодирования этого неподписанного компоновщика.Любая помощь очень ценится!

...