我用什么 C 函数来编码/解码LEB128格式的数字?我找不到任何简单的文档或示例。
问问题
2060 次
2 回答
4
一些读者可能会感兴趣,为什么LEB128
会有用。如果大多数时候数字的大小相对较小,它提供了一种表示数字的压缩。即使是随机输入,平均而言,它将使用 8 个字节中的 5 个来表示 64 位数字(尽管最坏的情况下,它将使用 10 个字节)。
以下是对无符号 64 位数字进行编码和解码的实现。我将把签名版本作为练习留给感兴趣的读者。
size_t fwrite_uleb128 (FILE *out, uint64_t x) {
unsigned char buf[10];
size_t bytes = 0;
do {
buf[bytes] = x & 0x7fU;
if (x >>= 7) buf[bytes] |= 0x80U;
++bytes;
} while (x);
return fwrite(buf, bytes, 1, out);
}
size_t fread_uleb128 (FILE *in, uint64_t *x) {
unsigned char buf;
size_t bytes = 0;
while (fread(&buf, 1, 1, in)) {
if (bytes == 0) *x = 0;
*x |= (buf & 0x7fULL) << (7 * bytes++);
if (!(buf & 0x80U)) break;
}
return !!bytes;
}
于 2013-08-12T20:25:34.827 回答
1
来自维基百科:
有符号数的表示方式类似,除了二进制补码的符号扩展为 7 位的倍数(确保最高有效位为正数为零,负数为 1)。然后将数字分为无符号编码的组。
do {
byte = low order 7 bits of value;
value >>= 7;
if (value != 0) /* more bytes to come */
set high order bit of byte;
emit byte;
} while (value != 0);
于 2013-08-12T19:48:59.660 回答