LDAP длинное представление длины сообщения

Я анализирую сообщения в связи клиент-сервер LDAP и не могу понять, как рассчитывается длина сообщения.

Основываясь на стандартах LDAP, при общении в ASN.1 каждое сообщение начинается с 0x30 (начало сообщения ldap) и следующие байты должны быть длиной сообщения (или число или соответствующие байты, которые следуют) до тех пор, пока есть 0x2 а также 0x1 сигнализация идентификатора сообщения. Это понятно

В коротких сообщениях это может выглядеть примерно так:

0x30    (start),
0x3c    (length),
0x2     (msg id..
0x1
0x1     ),
...

с длиной 0x3c или просто 60 в DEC, и количество следующих байтов до конца сообщения является на самом деле 60.

Чуть длиннее сообщение может выглядеть так:

0x30    (start),
0x81    (???),
0x8e    (length),
0x2     (msg id..
0x1
0x1     ),
...

с длиной снова точно в 0x8e (или же 142 в DEC), но что означает предыдущий байт?

Еще более длинное сообщение выглядит так:

0x30    (start),
0x82    (???),
0x2     (???),
0xe3    (???),
0x2     (msg id..
0x1
0x1     ),
...

ни с одним 0x82, 0x2 или же 0xe3 (или же 130, 2 или же 227 в DEC) фактическая длина (на самом деле 739)

и я не вижу логики между двумя последними примерами. Как длина представлена ​​в коде?

2

Решение

Есть два способа кодирования длин в ASN.1 — определенная форма и неопределенная форма.

Для определенной формы, если длина меньше 128, вы просто используете один байт с старшим битом, установленным в ноль. В противном случае старший бит устанавливается на единицу, а младший семь бит устанавливается на длину длины. Длина затем кодируется во многих байтах (в порядке с прямым порядком байтов).

0x82 имеет старший бит 1, а остальные биты равны 2, что означает, что следующие 2 байта содержат длину (0x02E3 = 739).

2

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

Других решений пока нет …