我试图解析GIF格式,有一个问题,读取图像数据。
该数据表示为位数组,包含可变长度的值。,
0010-1010-0010-0000-00111-10000-11111…
有时代码长度会增加,但我不明白如何检测到这种增加。我只有初始代码大小(第一个代码的长度,例如4)。
标准只说:
附录F.变长码LZW压缩。
…
该算法的可变长度代码方面是基于初始代码大小(LZW-initial code size),它指定用于的初始位数压缩码。当压缩机检测到的模式数在输入流中超过当前可编码的模式数每个LZW码的比特数增加1。
…
解析GIF文件时,图像描述符包含未编码符号的位宽度(例如:8位)。您可能已经知道,压缩数据的初始代码大小比未编码符号的位宽1位(例如:9位)。
另外,正如你可能已经知道的那样,GIF文件中可能压缩的代码值会逐渐增大,最大0xFFF == 4095,需要12位存储。
对于解压器从压缩数据中提取的每个代码,解压缩器向其字典中添加一个新项。例如,如果解压缩器读取的前两个9位代码为0x028 0x0FF,解压缩器将一个两字节序列添加到它的字典中。之后,如果解压缩器读到代码0x102,解压缩器将0x102解码为两个8位字节的0x28 0xFF。
解压缩器添加到字典中的下一项被分配为代码0x103。
解压缩器添加到字典中的下一项被分配为代码0x104. ...
最终,解压缩器向字典中添加一个项目,该项目被分配为代码0x1FF。这是9位所能容纳的最大的数。在将该项存储到字典中之后,解压器开始读取10位码。
解压缩器添加到字典中的下一项被赋值为代码0x200。
数据序列中没有任何特殊的"命令"告诉解压缩器增加代码宽度。解压缩器必须跟踪字典到目前为止包含了多少项(通常可以方便地重用为将下一个项写入字典的索引)。当解压缩器将项0x1ff添加到字典中时,解压缩器就该开始读取10位代码了。当解压缩器将0x3ff项添加到字典中时,解压缩器开始读取11位代码。
- Wikipedia:图形交换格式
- Wikipedia: Lempel-Ziv-Welch with变长代码
先看这个例子,理解LZW可能比看标准更清楚。这可能也是有用的