0

实现一个 SNMP v1 解码器并使用一些 Wireshark 捕获,我可以看到有时 BER 的长度字段如果用一个字节编码,而其他时候用两个字节编码。

读取 BER 规则,如果更重要的位设置为 1,则长度值必须用下一个字节扩展以表示大于 255 的值。

所以,如果第一个字节是 0x81,下一个字节是 0x9F,那么扩展的 Length 字段应该采用 0x9F 值......好吧

我的问题是:如果第二个字节是 0x9F,那么更有意义的位又是 1。

对于这个长度,Wireshark 只占用两个字节。

为什么在这种情况下 Length 的大小只有两个字节?

长度字段限制为 2 个字节?

谢谢。

4

3 回答 3

4

根据BER规则,长度字段可以是多个字节(远大于2),

http://en.wikipedia.org/wiki/KLV

长度字段

Key 的字节后面是 Length 字段的字节,它将告诉您在长度字段后面有多少字节并构成 Value 部分。长度字段有四种编码:1 字节、2 字节、4 字节和基本编码规则 (BER)。1 字节、2 字节和 4 字节变体非常简单:从字节中生成一个无符号整数,该整数是后面的字节数。

BER 长度编码有点复杂,但最灵活。如果长度字段中的第一个字节没有设置高位 (0x80),则该单个字节表示 0 到 127 之间的整数,并指示紧随其后的 Value 字节数。如果设置了高位,则低七位表示后面有多少字节,它们本身构成一个长度字段。

例如,如果 BER 长度字段的第一个字节是二进制 10000010,则表示接下来的两个字节组成一个整数,然后表示后面有多少个 Value 字节。因此,总共占用了三个字节来指定长度。

“如果第二个字节是 0x9F,那么更重要的位又是 1。” 这是一个问题吗?只有字节中的第一个字节决定了后面有多少字节用于确定长度。所以你永远不需要关心第二个字节的最高位。绝不。

Wireshark 如何表示字节并不是很关键。除非 Wireshark 向您显示错误的长度值,否则您不应该过多关注它。

于 2013-06-17T09:08:48.727 回答
0

我要补充一点,SNMP(通常)使用 UDP 数据报进行传输,限制为 65535 字节,即 0xffff。最多需要 2 个字节来编码长度。

于 2015-01-04T15:52:34.653 回答
0

在 ASN.1 BER 长度编码规则中:

a) 如果内容八位位组的数量 <= 127,那么长度八位位组编码内容八位位组的数量。

b) 否则,第一个长度八位字节的最高有效位设置为 1,其他 7 位描述后面的长度八位字节数。

c) 以下长度八位字节以 Big Endian 字节顺序对内容八位字节的长度进行编码。

示例:
长度 126:01111110
长度 127:01111111
长度 128:10000001 10000000
长度 1031:10000010 00000100 00000111

号码 | 第一个字节的 MSB | 表示数字的字节 | BE 二进制
128 | 1 | 0000001 (=1) | 10000000 (=128+0+0+0+0+0+0+0)
1031 | 1 | 0000010 (=2) | 00000100 00000111 (=1024+0+0+0+0+0+0+4+2+1)

于 2018-02-27T08:31:19.203 回答