В сборке .NET System.DirectoryServices.Protocols указан облегченный кодировщик ASN.1 BER, но документация невелика: BerConverter
.
Вы вызываете его, указывая строку формата и список объектов для кодирования.
INTEGER
могут быть закодированы символами форматаi
илиe
OCTET STRING
s можно закодировать символомo
SEQUENCE
можно закодировать с помощью{
и}
- и т.п.
Я бы очень хотел использовать этот простой конвертер, чтобы мне не приходилось брать на себя дополнительную зависимость. Принятие зависимости нежелательно, потому что C# можно вызывать из Powershell, и здорово распространять скрипт, который делает что-то интересное с C#, если для этого не требуется сборка, которая не включена в .NET.
Однако у BerConverter, похоже, нет способа указать тег Application или Context-Specific, которые часто используются для устранения неоднозначности в 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 такая возможность?
BerConverter.Encode()
и обнаружил, что он вызываетber_printf()
под прикрытием. Документация у него лучше. Смотрите ответ ниже. - person petrsnd   schedule 28.10.2016