2012-07-19 75 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