CubicLouve

Spring_MTの技術ブログです。https://github.com/SpringMT (http://spring-mt.tumblr.com/ からの移転)

壊れたgzipを調べたときのメモ

壊れたgzipがあり、展開できないと言われて調査したときにどうやったかのメモ

gzipとは

www.gzip.org

www.futomi.com

zcatで展開できるところまでしてみる

zcatは破損した位置までのデータを修復できる。

展開できたデータの最後を確認して修復する。

バイナリを見る

壊れているgzipの内容

$ od -xc data.json.gz | tail
        342 213 322 264   @ 370   D 024 365 221 243 003   )   u   3   >
2572260    346a    d38e    1aea    bcb8    7f2f    5a69    d8f8    0865
          j   4 216 323 352 032 270 274   / 177   i   Z 370 330   e  \b
2572300    0f84    f0a9    9d00    f404    03af    33e1    f451    e212
        204 017 251 360  \0 235 004 364 257 003 341   3   Q 364 022 342
2572320    e79b    818a    b9f8    6228    36a0    91d9    7edb    173c
        233 347 212 201 370 271   (   b 240   6 331 221 333   ~   < 027
2572340    20d0    f29c    ac0f    732d    b57b    4cb7    0a01
        320     234 362 017 254   -   s   { 265 267   L 001  \n
2572356

最後に改行文字が入っていた。

gzipを書き出すときに Kernel.#puts module function Kernel.#puts (Ruby 2.4.0) とかを使うと起きそう。

直してみる

Vim 上で :%!xxdをして、hexdumpする

:%!xxd -r でバイナリで書き戻して完了

$ od -xc data_zcat_json.gz | tail
        213 322 264   @ 370   D 024 365 221 243 003   )   u   3   >   j
2572300    8e34    ead3    b81a    2fbc    697f    f85a    65d8    8408
          4 216 323 352 032 270 274   / 177   i   Z 370 330   e  \b 204
2572320    a90f    00f0    049d    aff4    e103    5133    12f4    9be2
        017 251 360  \0 235 004 364 257 003 341   3   Q 364 022 342 233
2572340    8ae7    f881    28b9    a062    d936    db91    3c7e    d017
        347 212 201 370 271   (   b 240   6 331 221 333   ~   < 027 320
2572360    9c20    0ff2    2dac    7b73    b7b5    014c
            234 362 017 254   -   s   { 265 267   L 001
2572374

参照

技術/歴史/zip,gzip,zlib,bzip2 - Glamenv-Septzen.net

http://www.gzip.org/algorithm.txt

Man page of GZIP

qiita.com