LDAP 长消息长度表示
LDAP long message length representation
我正在剖析 LDAP 客户端-服务器通信中的消息,但无法理解消息长度的计算方式。
根据 LDAP 标准,当在 ASN.1 中通信时,每条消息都以 0x30
(ldap 消息开始) 开头,后面的字节应该是消息长度 (或后面的数字或相关字节) 直到有 0x2
和 0x1
表示消息 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 ),
...
,0x82
、0x2
或 0xe3
(或 DEC 中的 130
、2
或 227
)均不是实际长度(实际上是 739)
我看不出最后两个例子之间的逻辑。代码中的长度是怎么表示的?
ASN.1 中有两种编码长度的方式——定式和不定式。
对于定型,如果长度小于128,就用一个字节,高位置零。否则高位设置为1,低七位设置为length的长度。然后将长度编码为那么多字节(以大端顺序)。
0x82
高位为1,其余位为2,即后面2个字节为长度(0x02E3 = 739)。
我正在剖析 LDAP 客户端-服务器通信中的消息,但无法理解消息长度的计算方式。
根据 LDAP 标准,当在 ASN.1 中通信时,每条消息都以 0x30
(ldap 消息开始) 开头,后面的字节应该是消息长度 (或后面的数字或相关字节) 直到有 0x2
和 0x1
表示消息 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 ),
...
,0x82
、0x2
或 0xe3
(或 DEC 中的 130
、2
或 227
)均不是实际长度(实际上是 739)
我看不出最后两个例子之间的逻辑。代码中的长度是怎么表示的?
ASN.1 中有两种编码长度的方式——定式和不定式。
对于定型,如果长度小于128,就用一个字节,高位置零。否则高位设置为1,低七位设置为length的长度。然后将长度编码为那么多字节(以大端顺序)。
0x82
高位为1,其余位为2,即后面2个字节为长度(0x02E3 = 739)。