c++ 编写一个zigzag+varint的编码和解码demo
时间: 2024-03-16 22:44:42 浏览: 87
编码解码代码demo
以下是一个使用zigzag+varint编码和解码整数的C++示例代码,可以作为参考:
```c++
#include <iostream>
#include <vector>
// zigzag编码
int32_t zigzag_encode(int32_t n) {
return (n << 1) ^ (n >> 31);
}
// zigzag解码
int32_t zigzag_decode(int32_t n) {
return (n >> 1) ^ -(n & 1);
}
// varint编码
std::vector<uint8_t> varint_encode(uint32_t n) {
std::vector<uint8_t> buf;
while (n > 0x7f) {
buf.push_back((n & 0x7f) | 0x80);
n >>= 7;
}
buf.push_back(n);
return buf;
}
// varint解码
uint32_t varint_decode(const uint8_t* buf, size_t& len) {
uint32_t n = 0;
size_t shift = 0;
while (true) {
uint8_t b = buf[len++];
n |= (b & 0x7f) << shift;
if (!(b & 0x80)) break;
shift += 7;
}
return n;
}
// zigzag+varint编码
std::vector<uint8_t> encode(int32_t n) {
return varint_encode(zigzag_encode(n));
}
// zigzag+varint解码
int32_t decode(const uint8_t* buf, size_t len) {
return zigzag_decode(varint_decode(buf, len));
}
int main() {
int32_t n = -12345;
std::vector<uint8_t> encoded = encode(n);
size_t len = 0;
int32_t decoded = decode(encoded.data(), encoded.size(), len);
std::cout << n << " " << encoded.size() << " " << decoded << std::endl;
return 0;
}
```
在这个示例中,我们同样定义了zigzag编码和解码函数,以及varint编码和解码函数。不同的是,在varint解码函数中,我们使用引用传递一个长度参数,用于返回解码后数据的长度。然后我们定义了一个zigzag+varint编码和解码函数,它将整数先进行zigzag编码,然后再进行varint编码。在测试中,我们将一个有符号整数编码为zigzag+varint格式,然后解码回原始整数,并输出结果。
阅读全文