ASN.1 — Есть ли хорошая библиотека C ++ для чтения, создания и изменения файлов в кодировке BER?

Существует несколько инструментов, которые могут автоматически генерировать код C ++ (или другой) для чтения и записи файлов, закодированных в BER. В моем проекте на C ++ мне нужны библиотеки для чтения и изменения файлов в кодировке BER. Я не могу генерировать классы C ++ на основе заданной структуры данных, потому что нет заданной структуры данных. Пользователь должен иметь возможность добавлять и удалять целые числа, строки и т. Д. Я нашел проект с открытым исходным кодом, в котором есть редактор с такой функциональностью:
http://www.codeproject.com/Articles/4910/ASN-1-Editor

Тем не менее, это в C # ….

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

8

Решение

Убедитесь, что у вас есть правильный файл определения ASN. Затем перейдите по ссылке http://lionet.info/asn1c/asn1c.cgi

вставьте определение ASN в данное окно. Нажмите кнопку «Продолжить компиляцию ASN.1». Если вы получили ошибку компиляции, исправьте ее. После успешной компиляции он сгенерирует код для вашего декодера. Попробуйте это хорошо.

2

Другие решения

Существует не так много общих библиотек чтения BER, потому что невозможно однозначно проанализировать произвольные данные BER без каких-либо знаний о схеме.

Инструмент, на который вы указываете в CodeProject, редактирует схемы ASN.1, которые ИСПОЛЬЗУЮТСЯ для создания кодировок BER, но вы НЕ МОЖЕТЕ двигаться в другом направлении, не зная ничего о данных или не догадываясь. Невозможно сказать, глядя на идентификатор & длина элемента BER, содержит ли этот элемент примитивные данные или другие элементы BER.

Вот самый маленький пример, который я придумал, чтобы продемонстрировать проблему, всего 5 байтов, с двумя радикально разными интерпретациями:

0xA0 0x03 0x02 0x01 0x00

Теперь это явно сконструированный, специфичный для контекста тип. Это также определенной длины. Но что внутри? Вы не можете сказать!

Это может быть целое число (0x02 — это примитивный тег для целого числа, 0x01 — это длина, значение 0x00).

Но это также может быть цепочка битов (вы можете поместить битовую строку в составной тип, а затем 2 — это количество неиспользованных битов в конце, что означает, что у нас есть 14 битов, которые получаются
0000 0001 0000 00xxb = 00 0000 0100 0000b = 0x0040.

Вы можете написать редактор, который будет читать / изменять / записывать файлы BER, но он должен знать схему, иначе он не сможет что-либо правильно прочитать.

2