2015-03-03 3 views
0

Я уже некоторое время искал эту тему, не найдя подходящих ответов. Поэтому подумал о том, чтобы взять его на «Stackoverflow» ...ASN.1 кодировки BER, PER и т. Д. В C#

Мы пытаемся закодировать строку, чтобы передать ее по TCP/IP-соединению. Поскольку ASN.1 является самым популярным, чтобы сделать это, мы пытаемся использовать различные правила BER, DER, PER и т. Д., Чтобы узнать, какой из них мы можем использовать. Наше приложение представляет собой приложение на основе .net, и я искал свободно доступную библиотеку, которая делает это.

Странно, что я не мог найти никаких бесплатных библиотек. Итак, я начал искать в самой структуре .Net. Я обнаружил, что есть только «BERConverter». Итак, я сделал небольшой пример. Пример: строка

string str = "The BER format specifies a self-describing and self-delimiting format for encoding ASN.1 data structures. Each data element is encoded as a type identifier, a length description, the actual data elements, and, where necessary, an end-of-content marker. These types of encodings are commonly called type-length-value or TLV encodings. This format allows a receiver to decode the ASN.1 information from an incomplete stream, without requiring any pre-knowledge of the size, content, or semantic meaning of the data" 

В UTF-8 или ASCII оно отображается как 512 байт. Я использую следующий код для кодирования, используя BER

public static byte[] BerConvert(byte[] inputbytes) 
    { 
     byte[] output = BerConverter.Encode("{o}", inputbytes); 
     return output; 
    }  

Я получаю массив с размером 522. В некоторых других случаях, я считаю, что увеличение размера байт по сравнению с исходным текстом. Я думал, что кодирование уменьшит размер. Почему так происходит?

Помимо BER, существуют ли другие правила кодирования, такие как PER или DER, которые могут использоваться для уменьшения размера кодировки? Есть ли примеры, библиотеки или поддержка, которые помогут реализовать эти стили кодирования?

+0

Зачем уменьшать размер ASN.1? Это не то, для чего. Для этого используйте сжатие. –

+0

@NathanTuggy, ну, правила кодирования пакетов ASN.1 связаны с минимизацией количества бит, используемых для представления данных. Например, целому числу со значением '10' не требуется 32 бита, требуется только 4. PER использует это, используя только столько бит, сколько требуется текущему значению этого целого числа (плюс некоторые дополнительные функции для маркировки границ и т. Д.). Напротив, программа должна использовать 'int' для одного и того же целого в исходном коде или, может быть,' int8', если бы было известно, что он никогда не будет> 127. Нет 'int4'. Таким образом, PER-кодирование может быть меньше размера значения в памяти. – bazza

ответ

0

При поиске инструментов ASN.1 (свободных и коммерческих), хорошее место для начала - это веб-страница ITU-T http://www.itu.int/en/ITU-T/asn1/Pages/Tools.aspx, в которой перечислены несколько. Там есть коммерческие инструменты, которые поддерживают C#, но я не вижу бесплатного инструмента C#.

Что касается уменьшения размера кодировок, это в значительной степени зависит от характера вашей спецификации ASN.1 и правил кодирования. Если вы в основном отправляете текстовые строки, BER и DER не приведут к уменьшению размера вашего сообщения, в то время как PER может значительно уменьшить размер сообщения, если вы можете создать ограничение «разрешенного алфавита», указывающее меньший набор символов, разрешенных в отправляемом тексте.

Вы можете попробовать различные правила кодирования и различные ограничения, чтобы увидеть эффекты ваших изменений на бесплатном онлайн-декодере энкодера ASN.1 по адресу http://asn1-playground.oss.com.

0

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

Как вы, наверное, знаете, ASN.1 поставляется с небольшим количеством служебных данных - не только в сообщениях, но и в технике. Типичный рабочий процесс включает в себя запись спецификации, описывающей протокол, подачу ее в инструмент CASE, который генерирует исходный код для API, а затем интегрирует сгенерированные компоненты в ваше приложение.

Это говорит о том, что некоторые предпочитают более ad-hoc-подход. У Microsoft есть BER converter class, который вы можете попробовать использовать с C#: он может быть подходящим для ваших нужд.

Если сжатие важно, вы можете посмотреть в PER, как сказал Пол. Но сложно создавать правильные кодировки PER вручную, потому что они полагаются на спецификацию для выполнения сжатия.(Разрешенное ограничение алфавита записывается в спецификацию и используется для перечисления допустимых символов для сокращения кодировки.)

Для получения дополнительной информации о ASN.1 имеется ряд обучающих онлайн; вы также можете посмотреть стандарты ITU-T X.680-X.695, в которых указаны как синтаксическая нотация, так и различные правила кодирования.