いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

gzipの出力からcrc32を取得する (crc32コマンドが入っていないときなど)

関連記事

GitHub - devlights/blog-summary: ブログ「いろいろ備忘録日記」のまとめ

概要

以下、自分用のメモです。忘れないうちにメモメモ。。

CRC32を得る必要があるときがたまにあります。

crc32 コマンドが入っていれば、コマンド一発で得られるのですが、crc32 コマンドは例えばdebian系だと libarchive-zip-perl をインストールしないといけません。python使っても求めれますが、一旦これは置いておいて。

事情があって、crc32 コマンドを入れることが出来ないときは、gzipコマンドの出力からでも得られれます。

RFC 1952 - GZIP file format specification version 4.3

にあるように、gzipの末尾は CRC32 で 4バイト、ISIZEで4バイトとなっています。

なので、以下のようにすれば取れます。

$ gzip -1 -c /path/to/file | tail -c 8 | head -c 4 | hexdump -e '"%08x"'

こんな感じになります。

$ crc32 main.go
3db480c7

$ gzip -1 -c main.go | tail -c 8 | head -c 4 | hexdump -e '"%08x"'; echo ''
3db480c7

gzipコマンドの -1 は、最も速い圧縮という指定で圧縮率は低くなるけど速度が上がります。CRCを取りたいだけなので圧縮効率は必要ありません。-cは圧縮結果を標準出力に出してって指定です。パイプで末尾の8バイトを抜き出して、そこから先頭4バイトを抜き出して、最後にhexdumpで書式指定して出力。

末尾の echo は、改行のために入れているだけです。

参考情報


過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。