2017-06-28 81 views
1

私はcrc32を使って長い時間前にチェックを計算しましたが、どうやってやったのか思い出せません。linux bashの文字列からcrc32チェックサムを計算する方法

echo -n "LongString" | crc32 # no output 

解決策[1]がPythonで計算されましたが、文字列から計算する直接の方法はありませんか? Ubuntuで

# signed 
python -c 'import binascii; print binascii.crc32("LongString")' 
python -c 'import zlib; print zlib.crc32("LongString")' 
# unsigned 
python -c 'import binascii; print binascii.crc32("LongString") % (1<<32)' 
python -c 'import zlib; print zlib.crc32("LongString") % (1<<32)' 

[1] How to calculate CRC32 with Python to match online results?

答えて

3

、少なくとも、/usr/bin/crc32は短いPerlスクリプトで、あなたはそれを行うことができるすべての開いているファイルであることをその供給源から非常にはっきりと見ることができます。 stdinから読み取る機能はありません。ファイル名は-、または-cのような特殊な処理はありません。

あなたの最も簡単なアプローチは、そのファイルを使用して生きて一時ファイルを作成することです。

tmpfile=$(mktemp) 
echo -n "LongString" > "$tmpfile" 
crc32 "$tmpfile" 
rm -f "$tmpfile" 

あなたが本当にファイルを書き込みたくない場合(例えば、それはあなたのファイルシステムが取ることができるよりも多くのデータをだ - それは本当に「長い文字列」ですが、引数のためならばそう...) という名前のパイプを使用することができます。

fifo=$(mktemp -u) 
mkfifo "$fifo" 
echo -n "LongString" > "$fifo" & 
crc32 "$fifo" 
rm -f "$fifo" 

注背景に&次のコマンドは、それを読み取るまで、それはブロックされますので、fifoに書き込みプロセス:簡単な非ランダム・アクセス・リーダーに、これはファイルと区別がつきません。参照、一時ファイルの作成について詳しくは気難しい的には

https://unix.stackexchange.com/questions/181937/how-create-a-temporary-file-in-shell-script


また、(あなたのcrc32の存在を、独自のPerlワンライナーを書くから、一例として、スクリプトで何を使いますシステムはPerlと必要なモジュールがインストールされていることを示します)、すでに見つかったPythonの1つのライナーを使用します。

関連する問題