前提
勉強のためにdeflate圧縮されたデータを解読しようとしております。
まずは理解のために目で解読しようと試みているところです。
実際に解読した内容が合っているのか確認したいのと、他いくつかの質問がございます。
もし、間違っている箇所がございましたらご指摘いただきたくお願いします。
生のdeflate抽出ソースコード
下記のページを参考にして以下のように生のdeflateデータを抽出しました。
python3
1import zlib 2a = zlib.compress(b"aaaaaa")[2:-4] 3for c in a: 4 c = "{:08}".format(int(bin(c)[2:])) 5 print("{}".format(c[::-1]), end="") 6print("")
解読結果
まず、上記の結果が以下になりました。
1101001000110010001000001000000000000000
解読してみた結果は以下です。
"aaaaaa" 110 10010001 10010001 0000010 00000 0000000 00 BFINAL: 1 # 最終ブロック BTYPE: 01(10) # 固定ハフマン data: 10010001-00110000(0x61=a) # 8bit読み込み, base=00110000 data: 10010001-00110000(0x61=a) # 8bit読み込み, base=00110000 length: 0000010(0x103=259=5) # 7bit読み込み distance: 00000(0x0=1) # 5bit読み込み data: 0000000(0x0=end of block) # 7bit読み込み data: 00 # 余り
解読過程
解読した過程が以下です。
110 10010001 10010001 0000010 00000 0000000 00
ブロック情報の3ビットが110で
1: 最終ブロック
01(10): 固定ハフマン
続く8bit(10010001)を読み込みます。
参照ページの固定ハフマンの符号表より00110000を0としているので、実際の値を10010001-00110000から0x61を算出し、"a"だと分かりました。
その次の8bitも同様に"a"でした。
続く7bitを一致した長さとし、参照ページの一致した長さの対応表から実際の長さは5だと分かりました。
続く5bitを距離とし、参照ページの距離の表から実際の距離は1だと分かりました。
続く7bitはブロックの終端でした。
その次の2bitは不明です。
追記:
単純に最後8bitの余りでした。失礼しました。
質問
- 解読結果の認識は合っておりますでしょうか。
- 一致した長さや距離は表を参照して実際の値を求めるのが正解なのでしょうか。それとも何か計算で求めるのでしょうか。
- 距離はbit単位でしょうか。また、どの位置からみた距離なのでしょうか。
最後の2bitはどんな意味があるのでしょうか。(下記の"aaaaaabbbaaaaaa"で試した場合、後ろの不明なbitが00000になりました。)
追記:
単純に最後8bitの余りでした。失礼しました。
追加の解読結果
"aaaaaabbbaaaaaa" 110 10010001 10010001 0000010 00000 10010010 10010010 10010010 0000011 00101 1 10010001 0000000 00000 BFINAL: 1 # 最終ブロック BTYPE: 01(10) # 固定ハフマン data: 10010001-00110000(0x61=a) # 8bit読み込み, base=00110000 data: 10010001-00110000(0x61=a) # 8bit読み込み, base=00110000 length: 0000010(0x103=259=5) # 7bit読み込み distance: 00000(0x0=1) # 5bit読み込み data: 10010010-00110000(0x62=b) # 8bit読み込み, base=00110000 data: 10010010-00110000(0x62=b) # 8bit読み込み, base=00110000 data: 10010010-00110000(0x62=b) # 8bit読み込み, base=00110000 length: 0000011(0x104=260=6) # 7bit読み込み distance: 00101+1(0x110=6) # 5bit読み込み data: 10010001-00110000(0x61=a) # 8bit読み込み, base=00110000 data: 0000000(0x0=end of block) # 7bit読み込み data: 00000 # 余り
上記結果の追加質問
- "aaaaaabbb"の解読後、次がdataの"a"ではなく一致した長さから始まっているのはどうしてでしょうか。今回の場合ではブロックの終端前にdataの"a"がきています。
参照ページ
https://www.slideshare.net/7shi/deflate
http://darkcrowcorvus.hatenablog.jp/entry/2016/09/23/195644
http://d.hatena.ne.jp/n7shi/20110719/1311093479
https://www.futomi.com/lecture/japanese/rfc1951.html
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/12/09 09:29