【发布时间】:2018-06-11 13:41:25
【问题描述】:
我正在实现可变长度编码并阅读 wikipedia 的相关信息。这是我发现的:
0x00000080 0x81 0x00
这意味着0x80 int 被编码为0x81 0x00 2 个字节。那是我无法理解的。好的,按照我们那里列出的算法。
- 二进制
0x80:00000000 00000000 00000000 10000000 -
我们将符号位移动到下一个八位位组,因此我们拥有并设置为 1(表示我们有更多八位位组):
00000000 00000000 00000001 10000000不等于0x81 0x00。我试图为此编写一个程序:byte[] ba = new byte[]{(byte) 0x81, (byte) 0x00}; int first = (ba[0] & 0xFF) & 0x7F; int second = ((ba[1] & 0xFF) & 0x7F) << 7; int result = first | second; System.out.println(result); //prints 1, not 0x80
我错过了什么?
【问题讨论】:
-
我认为您错过了标题示例下的数字 137 示例。非常清楚。我不确定您为什么在步骤 2 中提到符号位,因为您的数字要么是无符号数,要么是正二进制补码数,因此不存在符号位问题。每个字节中都有一个 MSB(最高有效位),用于指示后面是否有另一个字节。每个字节编码原始数据的 7 位。
-
@ErwinBolwidt 但我使用这个例子将
0x80转换为可变长度编码。0x80 = 10000000,最低 7 位 =0000000和有效字节 = 00000000。所以最终我们有 00000001 00000000 != 0x81 。真的不明白错误... -
你忘记了维基百科的第四个要点,最高位表示后面会跟着另一个字节:10000001 00000000
-
@MarkJeronimus Btw,this resource 说
0x80!=0x81 0x00... -
您的资源是 LSB 优先的,而 Wikipedia 示例是 MSB 优先的。有你的不同。只需将低位、中位和高位 7 位部分的顺序颠倒即可。