2012-07-19 98 views
1

全部。使用gunzip來計算一個字符串的crc32代碼

我想使用gunzip來計算字符串的crc32代碼。

字符串:的TestString

此命令工作得很好:
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

你能告訴我這兩個命令之間的區別?謝謝!

+0

你不能自由地在標準輸出周圍跳轉,這對於尋找有用的媒體(在其中定義了一個起點,並且你可以在任何你喜歡的流上)都是必需的。 – nhahtdh 2012-07-19 04:30:08

+1

爲什麼不使用cksum?例如echo -n teststring | chksum – teambob 2012-07-19 04:55:37

回答

2

當您管道,接收可執行文件的輸入是不可搜索的。因此,你遇到的問題。

相反,你可以提取第二到最後四個字節,這是CRC:

% 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> 

在一般情況下,這是計算CRC相當低效的方式,因爲gzip的是做了很多工作來壓縮比是計算CRC。 (我把上面的-1選項放在最小化壓縮工作,但它仍然很多。)你應該簡單地編寫一個簡短的程序來計算crc。你的linux機器幾乎肯定有zlib庫可用。嘗試包括zlib.h並使用-lz進行鏈接。您可以閱讀zlib.h以瞭解如何使用crc32()函數。

評論中建議的cksum命令可用於計算不同的crc。如果你想要的只是任何crc,那麼你可以使用它。如果您想要gzip,zip,png等使用的crc,那麼您需要使用zlib中的crc32()例程或等效的例程。

+0

非常感謝,我從你的回答中學到了很多東西。 – chenzhiwei 2012-07-20 03:36:37

相關問題