【发布时间】:2019-07-06 19:23:51
【问题描述】:
我从未做过压缩,但对Huffman encoding 很感兴趣。他们将其显示为前几个字母的简单演示编码:
A 0
E 10
P 110
space 1110
D 11110
T 111110
L 111111
您看到的标准 Huffman 编码具有不同的代码集,但这对于这个问题并不重要。我想知道的是如何最有效地在 JavaScript 中操作这些位。据说您应该以 8、16 或 32 个块的形式处理事物,但实际上仅此而已,因为这就是整数和值在计算机体系结构中的存储方式。所以我理解的方式是你可能应该一次读取 8 位的输入块。我不确定该怎么做,但我认为如果你这样做,它会起作用:
var bytes = new Uint8Array(array)
var byte1 = bytes[0]
var byte2 = bytes[1]
...
这似乎是访问数据的最有效方式。但是我正在考虑另一种选择,我想澄清一下。您可以改为将输入转换为二进制文本字符串,即 1 和 0 的字符串,如
var string = integerOrByteArray.toString(2)
但我了解到,将任何内容转换为字符串都会影响性能。因此,您似乎应该尽可能避免转换为字符串。
因此,如果是这种情况,那么我们将使用Uint8Array(或Uint32Array 等)的第一种方法。我想知道如何将值有效/理想地拆分为组件部分。所以如果我们有这个......
010110
AEP
....我们做了整数的事情,然后我们可能会加载一些 8 位整数,比如其中之一:
01011000
01011001
00101100
...
就像是,我们需要(可能)加入任何可能是最后一个 8 位块的一部分的前端数据,然后将剩余的数据拆分为字符。我的问题基本上是推荐的这样做方式。我可以想出一些方法,但到目前为止它们看起来都相当复杂。
【问题讨论】:
-
TypedArrays 有.slice()和.subarray()方法。 -
@guest271314 仅适用于字节粒度。
标签: javascript encoding binary bit-manipulation huffman-code