【问题标题】:Given an integer, how big is its varint encoding?给定一个整数,它的 varint 编码有多大?
【发布时间】:2018-07-31 23:38:23
【问题描述】:

我有一个 Python 整数列表,我想知道当编码为 Protocol Buffers 可变长度整数序列或varints 时它将占用多少空间。在不实际编码整数的情况下解决这个问题的最佳方法是什么?

my_numbers = [20, 69, 500, 38987982344444, 420, 99, 1, 999]
e = MyCoolVarintArrayEncoder(my_numbers)
print(len(e))  # ???

【问题讨论】:

    标签: python encoding protocol-buffers varint


    【解决方案1】:

    每个整数都以 128 为基数编码,每个“数字”一个字节。任何基数中整数值表示的长度为 ceil(log(value, base))。

    取每个整数的log(base=128);将这些值四舍五入到最接近的整数;将这些四舍五入的值相加,就是你的长度。

    【讨论】:

    • 很好的答案,但还要注意:这对于正整数是正确的;负数总是...什么,10 个字节?
    • 糟糕,抱歉;这是关于 protobuf varint,而不是 Python int;但是,是的,对于有符号的 int32 或 int64 转换为 varint,负数总是十个字节长,正如@MarcGravell 所说。
    • 在 C# 中使用 Math.Log,0 的日志(以 128 为底)返回 -8,1 的日志(以 128 为底)返回 0。因此,我认为您需要对这两种情况进行特殊处理值,返回最小长度 1。(是的,我知道这是一个 Python 问题,但 Python 的 log 函数可能给出相同的值)。
    猜你喜欢
    • 1970-01-01
    • 2020-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多