2

全部。

我想使用 gunzip 来计算字符串的 crc32 代码。

字符串:测试字符串

此命令运行良好:
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

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

4

1 回答 1

3

当您通过管道传输时,接收可执行文件的输入根本不可搜索。因此,您遇到的问题。

相反,您可以提取倒数第​​二个字节,即 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,则需要使用crc32()zlib 中的例程或等效程序。

于 2012-07-19T08:42:21.413 回答