使用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
你能告诉我这两个命令之间的区别?谢谢!
当您管道,接收可执行文件的输入是不可搜索的。因此,你遇到的问题。
相反,你可以提取第二到最后四个字节,这是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()
例程或等效的例程。
非常感谢,我从你的回答中学到了很多东西。 – chenzhiwei 2012-07-20 03:36:37
你不能自由地在标准输出周围跳转,这对于寻找有用的媒体(在其中定义了一个起点,并且你可以在任何你喜欢的流上)都是必需的。 – nhahtdh 2012-07-19 04:30:08
为什么不使用cksum?例如echo -n teststring | chksum – teambob 2012-07-19 04:55:37