. NET. System.DirectoryServices.Protocols assembly указывает легкий ASN.1 BER-кодировщик, но документация невелика: BerConverter
.Могу ли я указать тег приложения или контекста с C# BerConverter.Encode()?
Вы вызываете его, указав строку формата и список объектов для кодирования.
INTEGER
ы могут быть закодированы с символами форматаi
илиe
OCTET STRING
ы могут быть закодированы сo
характеромSEQUENCE
ы могут быть закодированы с{
и}
- т.д.
Я бы очень хотел использовать этот простой конверт так что мне не нужно брать дополнительную зависимость. Взятие зависимости является нежелательным, потому что C# можно вызывать из Powershell, и это здорово распространять скрипт, который делает что-то необычное с C#, если он не требует сборки, которая не входит в .NET.
Однако BerConverter не кажется, есть способ указать приложение или конкретный контекст тег, который часто используется для удаления двусмысленности в ASN.1, например, когда компоненты сконструированного типа помечаются как OPTIONAL
Таким образом, я могу закодировать следующее:
BerConverter.Encode("{i{i}}", 1, 2);
Что дает:
30 84 00 00 00 0c 02 01 01 30 84 00 00 00 03 02 01 02
Но если эта вторая последовательность должна быть [Application 1]
или 61
... Я не уверен, что помещать в строку формата, чтобы испустить это в кодировке.
Есть ли у BerConverter эта возможность?
Вы может попытаться использовать декомпилятор (например, ILSpy) и посмотреть в коде BerConverter, чтобы узнать, что он делает. –
@bosonix Спасибо за комментарий. Я не знаю, почему я не думал декомпилировать. Я использовал JetBrains dotPeek для декомпиляции 'BerConverter.Encode()', и я узнал, что он вызывает 'ber_printf()' под обложками. Он имеет лучшую документацию. См. Ответ ниже. – petrsnd