ZIP解压实例
本文算是一个笔记吧,非常简洁。详细的内容到这篇博文http://www.cnblogs.com/esingchan/p/3958962.html。
已略过头尾信息,要解压的数据,内容是“As mentioned above,there are many kinds of wireless systems other than cellular.”
1010100001010011100010111011000000000001000001000011000010100010
1000101110101010011110110000000001100011101110000011100010100101
0101001111001100000010001101001010010010000101101010101100001101
1011110100011111100011101111111001110010011101110110011100010101
0010110100010100101100110001100100000100110111101101111000011101
0010001001100110111001000010011001101010101000110110000001110101
0100011010010011100010110111001000111101101001011100101010010111
0111000011111000011110000011010111001011011111111100100010001001
1010001100001110000010101010111101101010100101111101011111100000
解压开始:
>>>>
101(Header)01000(HLIT)01010(HDIST)0111(HCLEN) 000 101 110 110 000 000 000 010 000 010 000 110 000 101 000 101 000 101 000 (CCL)CCL范围为0-18(三位)
0 5 3 3 0 0 0 2 0 2 0 3 0 5 0 5 0 5 0
=3、5、5、5、3、2、2、0、0、0、0、0、0、0、0、0、0、5、3 <-> 调换位置根据这个顺序16 17 18 0 8 7 9 6 10 5 11 4 12 3 13 2 14 1 15
>>>>>
根据Deflate树的构造方式,得到下面的码表(Huffman码表3):
2 --- 00 <--> 5
2 --- 01 <--> 6
3 --- 100 <--> 0
3 --- 101 <--> 4
3 --- 110 <--> 18
5 --- 11100 <-->1
5 --- 11101 <-->2
5 --- 11110 <-->3
5 --- 11111 <-->17
>>>>>>
110(18)1010100(7比特,记录连续的11-138个0,此处一共0010101b=21,即记录21+11=32个0)
11110(3)110(18)0000000(7比特,记录连续的11-138个0,此处为全0,即记录0+11=11个0)
01(6)100(0)01(6)110(18)1110000(7比特,记录连续的11-138个0,此处为111b=7,即记录7+11=18个0)
01(6)110(18)0010100(7比特,记录连续的11-138个0,此处为10100b=20,即记录20+11=31个0)
101(4)01(6)01(6)00(5)11110(3)01(6)100(0)0000(5)0000(5)100(0)01(6)
101(4)00(5)101(4)00(5)100(0)100(0)00(5)101(4)101(4)01(6)01(6)01(6)100(0)
00(5)110(18)1101111(7比特,记录连续的11-138个0,此处为1111011b=123,即记录123+11=134个0)
01(6)00(5)01(6)
总共259个
>>>>>>>
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 (第一个3:表示排在第32位,码字长度=3(000),字符=(空格))
0 0 0 0 6 0 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 (第二个3:表示排在第101位,码字长度=3(001),字符=(e))
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 6 6 5 3 6 0 5 5 0 6 4 5 4 5 0 0 5 4 4 6 6 6 (第一个4:表示排在第97位,码字长度=4(0100),字符=(a))
0 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ....
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 5 6
里面的数字表示码长度。字符=取字符(数字的位置);如:第一个4,字符=取字符(97)=a
总共259个,每行40个。根据这个序列,同样按照Deflate树构造方法,得到literal/length码表(Huffman码表1)为:
32-- 000 --> (System.Char)(看前面的CL1序列,空格对应的ASCII为0x20=32,码字长度3,即上面序列中第一个3)
101--001 -->e(System.Char)
97-- 0100 -->a(System.Char)
108--0101 -->l(System.Char)
110--0110 -->n(System.Char)
115--0111 -->s(System.Char)
116--1000 -->t(System.Char)
100--10010 -->d(System.Char)
104--10011 -->h(System.Char)
105--10100 -->i(System.Char)
109--10101 -->m(System.Char)
111--10110 -->o(System.Char)
114--10111 -->r(System.Char)
121--11000 -->y(System.Char)
11001 -->3(System.Int32)(看前面的CL1序列,对应257,码字长度5)
44-- 110100 -->,(System.Char)
46-- 110101 -->.(System.Char)
65-- 110110 -->A(System.Char)
98-- 110111 -->b(System.Char)
99-- 111000 -->c(System.Char)
102--111001 -->f(System.Char)
107--111010 -->k(System.Char)
117--111011 -->u(System.Char)
118--111100 -->v(System.Char)
119--111101 -->w(System.Char)
111110 -->-1(System.Int32)(看前面的CL1序列,对应256,码字长度6)
111111 -->4(System.Int32)(看前面的CL1序列,对应258,码字长度6)
可以看出,码表里存在两个重复字符串长度3和4,当解码结果为-1(上面进行了处理,即256),或者说遇到111110的时候,表示Deflate码流结束。
>>>>>
按照同样的道理,对CL2序列进行解析,前面已经知道HDIST=10,即有11个CL2整数序列:
11111(17)000(3比特,记录连续的3-10个0,此处为0,即记录3个0)
11101(2)11111(17)100(3比特,记录连续的3-10个0,此处为001b=1,即记录4个0)
11100(1)100(0)11101(2)
已经结束,总共11个。
于是CL2序列为:
0 0 0 2 0 0 0 0 1 0 2
分别记录的是distance码为0-10的码字长度,根据下面的对应关系,需要进行扩展:

bits:扩展位数
code:对应CL2序列(0 0 0 2 0 0 0 0 1 0 2)
比如,第1个码长2记录的是Code=3的长度,即Distance=4对应的码字为:
10 -->4(System.Int32)
第1个码长1记录的是Code=8的长度(码字为0,扩展三位000-111),即Distance=17-24对应的码字为(注意,低比特优先):
0 000 -->17(System.Int32)
0 100 -->18(System.Int32)
0 010 -->19(System.Int32)
0 110 -->20(System.Int32)
0 001 -->21(System.Int32)
0 101 -->22(System.Int32)
0 011 -->23(System.Int32)
0 111 -->24(System.Int32)
注意,扩展的时候还是低比特优先。
最后1个码长2记录的是Code=10的长度(其实是码字:11,扩展四位0000-1111),即Distance=33-48对应的码字为:
11 0000 -->33(System.Int32)
11 1000 -->34(System.Int32)
11 0100 -->35(System.Int32)
11 1100 -->36(System.Int32)
11 0010 -->37(System.Int32)
11 1010 -->38(System.Int32)
11 0110 -->39(System.Int32)
11 1110 -->40(System.Int32)
11 0001 -->41(System.Int32)
11 1001 -->42(System.Int32)
11 0101 -->43(System.Int32)
11 1101 -->44(System.Int32)
11 0011 -->45(System.Int32)
11 1011 -->46(System.Int32)
11 0111 -->47(System.Int32)
11 1111 -->48(System.Int32)
至此为止,Huffman码表1、Huffman码表2已经还原出来,接下来是对LZ压缩所得到的literal、distance、length进行解码,目前剩余的比特流如下,
先按照Huffman码表1解码,如果解码结果是长度(>256),则接下来按照Huffman码表2解码,逐步解码即可:
>>>>>
[As ]:110110(A)0111(s)000(空格)
[mentioned ]:10101(m)001(e)0110(n)1000(t)10100(i)10110(o)0110(n)001(e)10010(d)000(空格)
[above,]:0100(a)110111(b)10110(o)111100(v)001(e)110100(,)
[there ]:1000(t)10011(h)001(e)10111(r)001(e)000(空格)
[are ]:0100(a)11001(长度3,表示下一个需要用Huffman解码)10(Distance=4,即重复字符串为re空格)
[many ]:10101(m)0100(a)0110(n)11000(y)000(空格)
[kinds ]:111010(k)10100(i)0110(n)10010(d)0111(s)000(空格)
[of ]:10110(o)111001(f)000(空格)
[wireless ]:111101(w)10100(i)10111(r)001(e)0101(l)001(e)0111(s)0111(s)000(空格)
[systems o]:0111(s)11000(y)0111(s)1000(t)001(e)10101(m)11001(长度指示=3,接下来根据distance解码)0110(Distance=20,即重复字符串为s o)
[ther ]:111111(长度指示=4,接下来根据distance解码)111001(Distance=42,即重复字符串为ther)000(空格)
[than ]:1000(t)10011(h)0100(a)0110(n)000(空格)
[cellular.]:111000(c)001(e)0101(l)0101(l)111011(u)0101(l)0100(a)10111(r)110101(.)
[256,结束标志]111110(结束标志)0000(字节补齐的0)
于是解压缩结果为:
As mentioned above,there are many kinds of wireless systems other than cellular.
1101100111000
101010010110100010100101100110001100100000100110111101101111000011101
0010001001100110111001000010011001101010101000110110000001110101
0100011010010011100010110111001000111101101001011100101010010111
0111000011111000011110000011010111001011011111111100100010001001
1010001100001110000010101010111101101010100101111101011111100000
>>>>>>>>
详细内容,慢慢补上吧

浙公网安备 33010602011771号