数字 > 2^31-1 的变体编码/解码问题

Varint encode/decode issue with number > 2^31-1

本文关键字:编码 问题 解码 31-1 gt 数字      更新时间:2023-10-16

下面的代码对数字<= 2^31-1正常工作,但对> 2^31-1的数字产生错误(太大)的结果。这是出乎意料的,因为我从来没有使用过uint32_t。

void encodeVarint(uint64_t value, uint8_t* output, uint8_t &outputSize)
{
    outputSize = 0;
    while (value > 127)
    {
        output[outputSize] = ((uint8_t)(value & 127)) | 128;
        value >>= 7;
        outputSize++;
    }
    output[outputSize++] = ((uint8_t)value) & 127;
}
uint64_t decodeVarint(uint8_t* input, uint8_t &inputSize)
{
    uint64_t ret = 0;
    inputSize = 0;
    for (uint8_t i = 0; ; i++)
    {
        ret |= (input[i] & 127) << (7 * i);
        inputSize++;
        if(!(input[i] & 128))
            break;
    }
    return ret;
}

谁能解释一下我做错了什么?

(input[i] & 127)的类型应该是int,并且可以是32位长

ret |= (uint64_t)(input[i] & 127) << (7 * i);

不是

ret |= (input[i] & 127) << (7 * i);