我想知道为什么在编码具有可变长度的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
如您所见,字节已交换。为什么会这样?
附加信息:第一个字节中的第一位表示还剩下一个字节。第一个字节中的最后一位代表符号(在这种情况下为正)。最后一个符号中的第一位表示没有更多的字节属于这个数字。
这是编码小整数或更精确地使用小[[absolute值的有效方法。 protobuf documentation中很好地解释了这个想法:
ZigZag编码将有符号整数映射到无符号整数,以便绝对值较小的数字(例如-1)的数字较小varint编码值。它以“曲折”回缩的方式执行此操作通过正负整数来回移动,因此-1为编码为1,1编码为2,-2编码为3,依此类推,可以在下表中看到[...]
小绝对值是很常见的情况。大值很少。因此,对于大多数用例,我们会携带很多(不必要的)零,而没有附加值。不幸的是,对于负值,它要复杂一些,因为我们必须关心符号位。
ZigZag算法以一种非常优雅,非常有效的方式解决了这个问题。