#include <iostream>
using namespace std;
// 小端存储
int varintEncode(int n, unsigned char *bytes) {
int idx = 0;
while (true) {
// 只有低7位,高位全部为0
if ((n & ~0x7f) == 0) { // 除低7位,全部为0
bytes[idx++] = (char) n;
break;
} else { // 除低7位,不全部为0
bytes[idx++] = ((unsigned char) ((n & 0x7f) | 0x80)); // 高1位置1,低7位按位与得到实际值
n = n >> 7;
}
}
return idx;
}
// 小端恢复
int varintDecode(unsigned char *bytes) {
int idx = 0;
int shift = 0;
int result = 0;
while (true) {
unsigned char b = bytes[idx++];
result |= ((b & 0x7f) << shift);
// 判断最高位是否为0
if ((b >> 7) == 0) {
break;
}
shift += 7;
}
return result;
}
int main() {
for (int i = 1; i < 1000000; i++) {
unsigned char bytes[5]{0};
if (i != varintDecode(bytes)) {
cout << "decode error" << endl;
}
}
}
c++ protobuf varint 简单编码和解码
最新推荐文章于 2024-01-22 21:45:00 发布