2021-03-18 varint编码测试

本文介绍了一个关于 Protobuf 中 Varint 编码方式的简单测试案例,通过 C++ 实现了 Varint 的编码与解码过程,并详细解释了 Varint 的小端编码特性及其在整数压缩中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

摘要:

针对protobuf中的varint, 写一个简单的测试, 标明编码是如何具体存储的

 

说明:

将整形压缩后的字节流, 放进string里, 因为在linux中, 整形是以小端存储, 所以要注意这点

 

特性如下:

  1. varint小端编码, 以最高位为控制连续位. 当最高位控制位为0时, 表面整数编码的最后一个字节. 即最后的结束字节, 最高位永远为0
  2. varint对于int类型, 因为截取最高位, 则编码后, 最多为5个字节
  3. 当整数 <=63, varint编码后为0X7F, 最高位被占用

 

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <string.h>
#include <stdint.h>


#include <string>
#include <iostream>
#include <typeinfo>


static inline void ToVarInt(int64_t value, std::string& str)
{
    uint64_t lvalue = static_cast<uint64_t>((value << 1) ^ (value >> 63));
    for (;;)
    {
        uint8_t aByte = lvalue & 0x7f;
        lvalue >>= 7;
        if (0 == lvalue)
        {
            str += (char)(aByte);
            break;
        }
        else
        {
            aByte |= 0x80;
            str += (char)(aByte);
        }
    }
}

static inline int64_t FromVarInt(const std::string& str)
{
    int i = 0;

    int64_t n = 0;
    int shift = 0;
    for (;;)
    {
        uint8_t aByte = (uint8_t) str[i++];
        int64_t bvar = aByte & 0x7f;
        n += (bvar << shift);
        shift += 7;
        if (0 == (aByte & 0x80))
        {
            break;
        }
    }

    return ((uint64_t)n >> 1) ^ (-(n & 1));
}


union Value
{
    int64_t v;
    char c[sizeof(int64_t)];
};

int main()
{
    int64_t t = 64;

    printf("%X\n\n", t);
    
    std::string str;
    ToVarInt(t, str);

    for (size_t i = 0; i < str.length(); i++)
    {
        uint8_t c = (uint8_t)str[i];
        printf("%X\n", c);
    }
    
    str.clear();
    str += (char) (0xfe);
    str += (char) (0xff);
    int64_t nt = FromVarInt(str);
    printf("%X\n\n", (int)nt);

    Value vl;
    vl.v = nt;
    for (size_t i = 0; i < sizeof(vl.c); i++)
    {
        printf("%X\n",  (uint8_t)vl.c[i]);
    }
    
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悟世者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值