设置
假设我有:
位图的LZW压缩产生的一系列数字:

256 1 258 258 0 261 261 259 260 262 0 264 1 266 267 258 2 273 2 262 259 274 275 270 278 259 262 281 265 276 264 270 268 288 264 257

由testream(包括LZW代码大小头和子块标记)编码的一种LZW压缩的可变长度的代码,它表示同一系列的数字:
00001000 00101001 00000000 00000011 00001000 00010100 00001000 10100000
01100000 11000001 10000001 00000100 00001101 00000010 01000000 00011000
01000000 11100001 01000010 10000001 00000010 00100010 00001010 00110000
00111000 01010000 11100010 01000100 10000111 00010110 00000111 00011010
11001100 10011000 10010000 00100010 01000010 10000111 00001100 01000001
00100010 00001100 00001000 00000000

以及initial code width8
问题
我试图从bytestream中导出初始的数字序列(整数数组)。
根据我所读的,这里的过程是从右向左扫描,一次读取initial code width位,从bytestream中提取整数。例如:
iteration #1:   1001011011100/001/    yield return 4
iteration #2:   1001011011/100/001    yield return 1
iteration #3:   1001011/011/100001    yield return 6
iteration #4:   1001/011/011100001    yield return 6

此过程不适用于迭代5,它将产生1:
iteration #5:   1/001/011011100001    yield return 1 (expected 9)

代码宽度应该增加一个。
问题
在读取由testream编码的可变长度时,我应该如何知道何时增加代码宽度?我有所有必要的信息来解压这个bytestream吗?我是不是在概念上遗漏了什么?
更新:
在与greybeard进行了长时间的讨论之后-我发现我错误地读取了二进制字符串:initial code width + 1将被解释为00000000 00000011 00。bytestream没有读作big-endian。
非常粗略地说,如果你正在解码一个bytestream,你每次读2^n-1码时都会增加读取的比特数,其中n是当前的码宽。

最佳答案

解压时,你应该用和压缩器差不多的方法来构建字典。你知道你需要增加代码宽度,只要压缩器可能使用的代码对于当前宽度来说太宽。
只要字典没有满(最大码没有被分配),就为每一个(常规)代码分配一个新的代码(不是清晰的代码或信息代码的结尾)。
以您链接的presentation中的示例为例,当第二个8被“传输”时,6被分配-您需要在读取下一个代码之前切换到四位。
(这就是示例与series of numbers的不同之处-链接显示4, 1, 6, 6, 2, 9

09-06 04:40