Я анализирую сообщения в связи клиент-сервер 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)
и я не вижу логики между двумя последними примерами. Как длина представлена в коде?
Есть два способа кодирования длин в ASN.1 — определенная форма и неопределенная форма.
Для определенной формы, если длина меньше 128, вы просто используете один байт с старшим битом, установленным в ноль. В противном случае старший бит устанавливается на единицу, а младший семь бит устанавливается на длину длины. Длина затем кодируется во многих байтах (в порядке с прямым порядком байтов).
0x82
имеет старший бит 1, а остальные биты равны 2, что означает, что следующие 2 байта содержат длину (0x02E3 = 739).
Других решений пока нет …