【问题标题】:Why swap bytes in variable length encoding in the Thrift CompactProtocol?为什么在 Thrift CompactProtocol 中以可变长度编码交换字节?
【发布时间】:2023-07-07 11:29:01
【问题描述】:

我想知道为什么在用可变长度编码 Int 时必须在 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】:

    这是一种编码小整数的有效方法,或者更准确地说是使用小的绝对值。这个想法在protobuf documentation中解释得很好:

    ZigZag 编码将有符号整数映射到无符号整数,以便 绝对值小的数字(例如 -1) varint 编码值也是。它以“曲折”的方式做到这一点 来回通过正整数和负整数,所以 -1 是 编码为 1,1 编码为 2,-2 编码为 3,依此类推,因为你 可以在下表中看到[...]

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

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

    【讨论】:

    • 但它们不同,各有 1337 个: - 节俭方式:0xf214(在书中) - ZigZag 编码:0x0a72 ((1337 > 63))
    最近更新 更多