【问题标题】:Variable-byte encoding clarification可变字节编码说明
【发布时间】:2010-03-28 00:06:06
【问题描述】:

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

我正在尝试理解可变字节编码。我已经阅读了 Wikipedia 文章 (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 位来表示它?

提前感谢您的澄清。

【问题讨论】:

    标签: encoding multibyte


    【解决方案1】:

    您这样做的方式是保留其中一位以表示“我没有完成该值”。通常,这是最重要的位。

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

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

    1. 预期值 = 0
    2. byte=ReadFromFile
    3. ExpectedValue = ExpectedValue + (byte AND 0x7f)
    4. 如果字节 > 127 那么
      1. ExpectedValue = ExpectedValue SHL 7
      2. 转到 2
    5. 完成

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

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

    【讨论】:

    • 但是当你写 1 0 1 1 1 1 0 0 到一个文本文件时,它需要 8 个字节(每个一个),而 60 只需要 2 个字节。你如何节省空间然后。如果您可以在答案中提供代码,那就太好了
    • @Programmer:我不确定我是否理解你的问题。可变长度编码仅在讨论二进制数据时才有意义,因此您永远不会将其写入文本文件;你会以二进制形式写入由该系列位表示的字节。
    【解决方案2】:

    你一针见血。

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-07
        • 1970-01-01
        相关资源
        最近更新 更多