使用gunzip计算一个字符串的crc32代码

时间:2012-07-19 04:26:16

标签: linux crc32 gunzip

所有

我想使用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

你能告诉我这两个命令之间的区别吗?谢谢!

1 个答案:

答案 0 :(得分: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()例程,或者等效的。