LoginSignup
0
0

More than 1 year has passed since last update.

gzip 圧縮したファイルを cat で繋ぐと、Ruby では読めないよ

Last updated at Posted at 2022-07-08

「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)
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0