自制轻量Zip写入器能否省略CRC32校验?内存受限场景咨询
轻量Zip写入器的CRC32相关问题解答
问题1:能不能做一个条目头和中央目录都不带CRC32的合法Zip文件?CRC32是必填的吗?
- 按Zip官方标准来说,CRC32不是所有场景都必须填,但不能直接“删掉这个字段”——要么靠标志位声明后续补全,要么在自己的专属读写场景里跳过。
- 要是想兼容WinRAR、7-Zip这类通用解压工具,你不能完全省掉CRC32,但可以先填0,配合标志位告诉工具后面会补全(不过这还是得计算CRC32);如果只是自己的程序读写用,你可以自定义规则跳过CRC32,但这时候生成的文件不算标准合法Zip。
问题2:能不能设个标志位说明没带CRC32,把CRC相关的位设成1或0?
可以用Zip的**通用位标志(General Purpose Bit Flag)**来实现,但得分情况:
- 要兼容通用工具的话:把标志位的第3位(二进制
00001000,十进制8)设为1,这时候本地文件头和中央目录里的CRC32、压缩大小、未压缩大小都能填0,但你必须在文件数据末尾加个数据描述符结构,里面得有正确的CRC32——这还是得计算CRC32,不符合你“不想计算”的需求。 - 要是只给自己的程序用:你可以自己约定一个标志位(比如用标准没用到的位,或者自定义规则),说明这个条目没带CRC32,这时候CRC32字段填0或者任意值都行,你的解压程序认出这个标志就跳过校验。但这种文件通用工具不认,会被判定为损坏。
- 要兼容通用工具的话:把标志位的第3位(二进制
额外补充:如果你只是想把多个文件用Zip格式做简单拼接,完全不想计算CRC32,那只能放弃通用兼容性,在自己的读写逻辑里跳过CRC32校验,生成的文件虽然通用工具会报错,但能满足你的核心需求。
内容的提问来源于stack exchange,提问作者Endless
相关产品推荐
相关产品推荐

