4

我用什么 C 函数来编码/解码LEB128格式的数字?我找不到任何简单的文档或示例。

4

2 回答 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 回答