2016-09-09 2 views
0

Мне нужно декодировать сообщение ASN1 с помощью python. Я заглянул в библиотеку pyasn1, но не поддерживает UPER. Что я могу использовать для декодирования ASN1 UPER в pythonДекодирование ASN1 UPER в Python

ответ

1

У вас есть схема?

Предполагая, что у вас есть схема ASN.1 для данных, которые вы пытаетесь декодировать, вы можете начать с просмотра TASTE framework from the European Space Agency. Это крупная платформа разработки приложений, основанная на ASN.1 для системы космических аппаратов.

Структура не имеет отношения к вам и вашим потребностям. Тем не менее, скрывается где-то в основе его как компилятор схемы ASN.1, который поддерживает генерацию кода Python и uPER. Лучше всего начать с тестирования своего встроенного образа VM, который даст вам Linux со всем уже установленным: see here. Вы должны использовать это для компиляции схемы в исходный код python, который затем может кодировать/декодировать данные uPER из/в классы Python. В стороне, вы также можете сделать то же самое для C, C++, C#, Java, ADA.

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

Не получил схему?

Если у вас нет схемы, тогда у вас будут проблемы. uPER не может быть декодирован без файла схемы. Это связано с тем, что данные UPER достаточно упакованы, что осталось немного информации о структуре данных. Вы бы сговорились, догадавшись, что такое схема, попробовав декодировать, посмотрите, работает ли она на всех ваших данных, повторите попытку, если нет.

Если было известно, что это каноническое кодирование PER, вы можете декодировать его без схемы, но это еще много усилий.

Это резко контрастирует с закодированными данными BER, которые сохраняют информацию о структуре данных путем включения информации о тегах, типе и значении для каждого кодированного поля PDU. Но тогда кодированные данные BER намного больше, чем PER, поэтому он не используется в системах радиосвязи или других каналах передачи с ограниченной пропускной способностью.

== EDIT ==

Только что взглянули вон там на ВКУСА теперь я не уверен, что это не генерировать код Python. Python является зависимостью для фреймворка, но он нигде не утверждает, что он генерирует код Python. Похоже, это просто C/C++ или ADA.

Независимо от того, компилятор ASN.1, похоже, закончился here on GITHUB. Это сгенерирует C-код (и ADA, wow!), Который вы могли бы вызвать из своего Python так или иначе. Это будет не совсем аккуратно, но все же лучше, чем ничего.

Примечание Этот компилятор ограничен в какой схеме он будет компилироваться (ему нужны ограничения по размеру на массивах и т. Д., По-видимому, в конечном итоге с объектами статического размера).

Лучше всего назвать код C, C++ или Java или C#, сгенерированный другими компиляторами ASN.1, - есть коммерческие версии на Objective Systems и OSS Nokalva.

== Еще один Edit ==

This page говорит о Python, ASN.1 упер.

== Encore == ип Редактировать

PyASN1 страница относится к asn1ate, который представляет собой генератор кода для Python. Сообщается, что это «альфа-качество», но для простой схемы это может быть адекватным. Это, безусловно, стоит посмотреть.

+0

в основном прямо здесь: для ASN.1 нет никаких генераторов кода Python, по крайней мере, я не знаю. Есть несколько возможных решений, если вы привязаны к Python: (1) генерируете C# и используете IronPython; (2) генерировать Java и использовать Jython; (3) сгенерировать C/C++ и использовать Swig или Boost.python, чтобы обернуть сгенерированный код. – Ethan

+0

@Ethan, ваша идея использовать C# сгенерированный код из IronPython - это, пожалуй, самый чистый способ сделать это. С тех пор я обнаружил, что для Python есть генератор кода альфа-качества, я ссылался на него в редактировании на мой ответ, но C# + IronPython по-прежнему является самым надежным способом получить хороший результат, который я бы сказал. Конечно, коммерческие инструменты, которые я использовал для C# и ASN.1, являются «правильными». – bazza

1

Недавно я начал внедрять кодек Unaligned Packed Encoding Rules (UPER) в пакете Python asn1tools. Это далеко не полный пока нет, но есть основной синтаксический анализ, кодирование и поддержку декодирования типов SEQUENCE, CHOICE, INTEGER, BOOLEAN, IA5String, ENUMERATED, BIT STRING, OCTET STRING и SEQUENCE OF.

Ниже приведен пример того, как использовать пакет для компиляции спецификации под названием foo.asn, а затем использовать его для кодирования и декодирования типа вопроса:

>>> import asn1tools 
>>> foo = asn1tools.compile_file('tests/files/foo.asn', 'uper') 
>>> encoded = foo.encode('Question', {'id': 1, 'question': 'Is 1+1=3?'}) 
>>> encoded 
bytearray(b'\x01\x01\t\x93\xcd\x03\x15l^\xb3~') 
>>> foo.decode('Question', encoded) 
{'question': u'Is 1+1=3?', 'id': 1} 
>>> 
0

как можно декодировать ASN1 двоичный файл (cdr) с использованием python или java?

Смежные вопросы