LDAP 长消息长度表示

LDAP long message length representation

我正在剖析 LDAP 客户端-服务器通信中的消息,但无法理解消息长度的计算方式。

根据 LDAP 标准,当在 ASN.1 中通信时,每条消息都以 0x30 (ldap 消息开始) 开头,后面的字节应该是消息长度 (或后面的数字或相关字节) 直到有 0x20x1 表示消息 ID。这很清楚。

在短消息中,它可能看起来像这样:

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

长度为 0x3c 或在 DEC 中只是 60,并且直到消息结束的后续字节数 实际上是 60。

稍长的消息可能如下所示:

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

长度再次正好在 0x8e(或 DEC 中的 142),但前一个字节是什么意思?

更长的消息如下所示:

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

0x820x20xe3(或 DEC 中的 1302227)均不是实际长度(实际上是 739)

我看不出最后两个例子之间的逻辑。代码中的长度是怎么表示的?

ASN.1 中有两种编码长度的方式——定式和不定式。

对于定型,如果长度小于128,就用一个字节,高位置零。否则高位设置为1,低七位设置为length的长度。然后将长度编码为那么多字节(以大端顺序)。

0x82高位为1,其余位为2,即后面2个字节为长度(0x02E3 = 739)。