2

全て。

gunzip を使用して文字列の crc32 コードを計算したいと考えています。

文字列:テスト文字列

このコマンドはうまく機能します:
echo -n teststring | gzip -f > /tmp/filename && gunzip -lv /tmp/filename && rm -f /tmp/filename

しかし、このコマンドは機能しません:
echo -n teststring | gzip -f | gunzip -lv

すべての gunzip マニュアルを検索したところ、「圧縮ファイルがシーク不可能なメディア上にある場合、 --list オプションはサイズを -1 として報告し、crc を ffffffff として報告します。」を見つけました。標準出力がシーク不可能なメディアである理由を知りたい? このコマンドをうまく機能させるにはどうすればよいですか?

アップデート:

これは機能しません:
cat /tmp/filename | gunzip -lv

これはうまくいきます:
gunzip -lv < /tmp/filename

この 2 つのコマンドの違いを教えてください。ありがとうございました!

4

1 に答える 1

3

パイプすると、受信側の実行可能ファイルへの入力はシークできなくなります。したがって、あなたが経験している問題。

代わりに、crc である最後から 2 番目の 4 バイトを抽出できます。

% echo -n teststring | gzip -1 | tail -c 8 | head -c 4 | hexdump -e '1/4 "%08x" "\n"'
1f58f83e

またはpigz (たまたまリストを検索しようとしない gzip の並列バージョン) を使用することもできます。

% echo -n teststring | gzip -1 | pigz -lv
method    check    timestamp    compressed   original reduced  name
gzip 8  1f58f83e  Jul 19 01:35          12         10  -20.0%  <stdin>

一般に、gzip は crc を計算するよりも多くの作業を圧縮するため、crc を計算する方法としてはかなり非効率的です。(圧縮作業を最小限に抑えるために上記のオプションを入れました-1が、それでもなお多くの作業が必要です。) crc を計算する短いプログラムを作成するだけです。お使いの Linux マシンには、ほぼ確実に zlib ライブラリが用意されています。リンクに含めzlib.hて使用するようにしてください。機能の使用方法を-lz読むことができます。zlib.hcrc32()

コメントで提案されたcksumコマンドを使用して、別の crc を計算できます。必要なのがcrcだけであれば、それを使用できます。gzip、zip、png などで使用される crc が必要な場合はcrc32()、zlib または同等のルーチンを使用する必要があります。

于 2012-07-19T08:42:21.413 に答える