「gzip 圧縮したファイルは cat で繋ぐことができる」という話を聞いていて、 gzip の凄さに感動していたのだけれど、 Ruby を使って読もうとしたら駄目だったので、残念だった。
cat
で繋いだファイルと、 gzcat+gzip
で繋いだファイルを用意する。
$ echo 'aaa' | gzip > aaa.gz
$ echo 'bbb' | gzip > bbb.gz
$ cat aaa.gz bbb.gz > cat.gz
$ gzcat aaa.gz bbb.gz | gzip > gzcat.gz
gzcat
で読むと、結合されていることが判る。
$ gzcat gzcat.gz
aaa
bbb
(rc->0)
$ gzcat cat.gz
aaa
bbb
Ruby で読む
[1] pry(main)> require 'zlib'
=> false
[2] pry(main)> Zlib::GzipReader.open('gzcat.gz').read
=> "aaa\nbbb\n"
[3] pry(main)> Zlib::GzipReader.open('cat.gz').read
=> "aaa\n"
cat.gz
の方は、 aaa.gz
の内容は読めているが、 bbb.gz
の方の内容は読めていない。
End of file
的なものに到達しているか、ヘッダ的な箇所に読み込むバイト数が決まっているか、何かではないか?
0000
があると打ち切るとかかな……?
$ od -x aaa.gz
0000000 8b1f 0008 dc0b 62c7 0300 4c4b e44c 0002
0000020 5d95 77f8 0004 0000
0000030
(rc->0)
$ od -x bbb.gz
0000000 8b1f 0008 dc12 62c7 0300 4a4b e24a 0002
0000020 1fe1 4c26 0004 0000
0000030
(rc->0)
$ od -x gzcat.gz
0000000 8b1f 0008 dc7c 62c7 0300 4c4b e44c 4a4a
0000020 e24a 0002 3cbe b0d8 0008 0000
0000034
(rc->0)
$ od -x cat.gz
0000000 8b1f 0008 dc0b 62c7 0300 4c4b e44c 0002
0000020 5d95 77f8 0004 0000 8b1f 0008 dc12 62c7
0000040 0300 4a4b e24a 0002 1fe1 4c26 0004 0000
0000060
(rc->0)