为什么在Thrift CompactProtocol中以可变长度编码交换字节?

问题描述 投票:0回答:1

我想知道为什么在编码具有可变长度的Ints时为什么必须在Trift CompactProtocol中交换字节。

[取自Data Intensive Applications的示例(在线,第120页):

Number in Base 10 to be encoded: 1337
1337 in Base 2: 0010100 111001
Encoding first byte:  1|111011|0
Encoding second byte: 0|0010100

如您所见,字节已交换。为什么会这样?

附加信息:第一个字节中的第一位表示还剩下一个字节。第一个字节中的最后一位代表符号(在这种情况下为正)。最后一个符号中的第一位表示没有更多的字节属于这个数字。

encoding integer thrift variable-length
1个回答
1
投票

这是编码小整数或更精确地使用小[[absolute值的有效方法。 protobuf documentation中很好地解释了这个想法:

ZigZag编码将有符号整数映射到无符号整数,以便绝对值较小的数字(例如-1)的数字较小varint编码值。它以“曲折”回缩的方式执行此操作通过正负整数来回移动,因此-1为编码为1,1编码为2,-2编码为3,依此类推,可以在下表中看到[...]

小绝对值是很常见的情况。大值很少。因此,对于大多数用例,我们会携带很多(不必要的)零,而没有附加值。不幸的是,对于负值,它要复杂一些,因为我们必须关心符号位。

ZigZag算法以一种非常优雅,非常有效的方式解决了这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.