可变字节编码说明

时间:2010-03-28 00:06:06

标签: encoding multibyte

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

我正在尝试理解可变字节编码。我已阅读维基百科文章(http://en.wikipedia.org/wiki/Variable-width_encoding)以及信息检索教科书中的book chapter。我想我理解如何编码十进制整数。例如,如果我想为整数60提供可变字节编码,我会得到以下结果:

1 0 1 1 1 1 0 0

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

提前感谢您的澄清。

3 个答案:

答案 0 :(得分:4)

你这样做的方法是保留其中一个位来表示“我没有使用该值。”通常,这是最重要的一点。

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

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

  1. ExpectedValue = 0
  2. 字节= ReadFromFile
  3. ExpectedValue = ExpectedValue +(byte AND 0x7f)
  4. if byte> 127然后
    1. ExpectedValue = ExpectedValue SHL 7
    2. 转到2
  5. 完成
  6. 例如,值0x80将使用字节0x81 0x00表示。您可以尝试在这两个字节上运行算法,并且您会看到您将获得正确的值。

    UTF-8的工作方式类似,但它使用稍微复杂的方案来告诉您应该预期的字节数。这允许进行一些错误纠正,因为您可以轻松判断您获得的字节是否与声明的长度相匹配。 Wikipedia describes their structure很好。

答案 1 :(得分:1)

你的头上钉了一针。

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

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

答案 2 :(得分:0)

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