5

我对字节编码的世界很陌生,所以如果我以错误的方式使用/表达简单的概念,请原谅我(并且一定要纠正我)。

我试图理解可变字节编码。我已经阅读了 Wikipedia 文章 ( http://en.wikipedia.org/wiki/Variable-width_encoding ) 以及信息检索教科书中的一本书章节。我想我了解如何编码十进制整数。例如,如果我想为整数 60 提供可变字节编码,我将得到以下结果:

1 0 1 1 1 1 0 0

(如果以上内容不正确,请告诉我)。如果我了解该方案,那么我不完全确定信息是如何压缩的。是不是因为通常我们会使用 32 位来表示一个整数,所以表示 60 会导致1 1 1 1 0 0前面有 26 个零,从而浪费了那个空间而不是只用 8 位来表示它?

预先感谢您的澄清。

4

3 回答 3

4

你这样做的方式是保留一个位来表示“我没有完成这个值”。通常,这是最重要的位。

当您读取一个字节时,您处理的是低 7 位。如果最高有效位是 1,那么您知道还有一个字节要读取,然后您重复该过程,将接下来的 7 位添加到当前的 7 位。

MIDI 格式使用该精确编码来表示 MIDI 事件的长度,方式如下:

  1. 预期值 = 0
  2. byte=ReadFromFile
  3. 预期值 = 预期值 +(字节与 0x7f)
  4. 如果字节 > 127 则
    1. 预期值 = 预期值 SHL 7
    2. 转到 2
  5. 完毕

例如,值 0x80 将使用字节 0x81 0x00 表示。你可以尝试在这两个字节上运行算法,你会看到你会得到正确的值。

UTF-8 的工作方式类似,但它使用稍微复杂的方案来告诉您应该期待多少字节。这允许进行一些错误纠正,因为您可以轻松判断您获得的字节是否与声明的长度匹配。维基百科很好地描述了它们的结构。

于 2010-03-28T00:18:46.373 回答
1

你击中了要害。

有许多编码方案,例如 gamma 和 delta,它们是 elias 编码的特例。这些是位级代码,与您使用的字节级代码相反,当您强烈倾向于小数字时(通常可以通过编码增量而不是绝对值来实现),这些代码很有用。

位级编码方案比字节级方案更难实现,而且额外的 CPU 负担可能超过读取更少数据所节省的时间,尽管大多数现代 CPU 都有“最高位”和“最低位”指令这极大地提高了比特级编解码器的性能。随着 CPU 速度继续超过 RAM 速度,位级方案将变得更具吸引力,尽管字节级编解码器的简单性也是一个重要因素。

于 2010-03-28T00:12:07.643 回答
0

是的,你是对的,通过使用 1 个字节而不是 4 个字节进行编码可以节省空间。通常,如果要编码的值远小于原始固定宽度编码的最大值,则会节省内存。

于 2010-03-28T00:13:22.580 回答