ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Вторник
20 января
1566494 Топик полностью
OlegPowerC (Сегодня, 17:14, просмотров: 22) ответил =AlexD= на ASN.1 это язык описания протокола, им описывают всякие регистры и битовые поля.
И да, в Go есть парсер ASN.1 в стандартной библиотеке, но он поддерживает только DER (это такой довольно строгий и однозначный формат), а в SNMP используется BER. Например длина кодируется так, если старший бит в байте длины равен нулю, то длина это оставшиеся биты, а если он 1, то оставшиеся биты это сколько байт следующих содержат длину. Например 0x05 - длина 5 байт 0x81 0xff длина 255 байт. А вот BER позволяет себе вольности, например длина 5 байт может быть в такой форме: 

0x82 0x00 0x05. А еще есть неопределенная длина для составных типов, например байт длины 0x80 значит далее идет SEQUENCE (тип в который запихнули примитивные типы) а в конце 0x00 0x00 - это конеч этой последовательности.

А еще могут быть такие последовательности вложенные в такие последовательности :-) вобщем форкнул я парсер гошный и сделал его умеющим это распарсить, собирать же можно строго - приемник поймет DER - он однозначный.

Вот вам парсер если что - там много много тестов. https://github.com/OlegPowerC/asn1modsnmp