所有
我想使用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 :(得分: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()
例程,或者等效的。