如何区分拥有相同魔数的gzip与TarGzip格式文件?
区分gzip与TarGzip文件的方法
二者魔数均为十六进制
1f 8b的原因非常简单:TarGzip(.tar.gz)本质就是先将多个文件/目录打包为tar归档,再用标准gzip算法压缩整个tar包,外层完全符合gzip格式规范,所以外层魔数和普通gzip文件没有任何区别,区分的核心是校验gzip解压后的内容格式。
以下是具体可用的区分方案:
直接用系统内置命令识别(最简便)
类Unix系统内置的file命令已经内置了判断逻辑,它会在识别到gzip格式后,进一步读取部分内容做流式解压,校验解压后的数据是否符合tar归档的格式特征,直接执行以下命令即可得到结果:file <目标文件路径>输出结果区分非常明确:
- 普通gzip文件:输出类似
gzip compressed data, original size ... - TarGzip文件:输出类似
gzip compressed data, was "xxx.tar", last modified: ...
- 普通gzip文件:输出类似
手动验证逻辑(适合代码实现)
不需要完整解压整个文件,只需要读取部分数据即可完成判断,逻辑如下:- 读取文件前2字节,确认是
1f 8b的gzip魔数 - 对文件做流式gzip解压,仅读取到解压后数据的第257字节偏移位置即可停止
- 校验该偏移位置开始的连续5字节是否为十六进制
75 73 74 61 72(对应ASCII字符串ustar,是tar格式的标准魔数):如果匹配则为TarGzip文件,否则为普通gzip文件。
- 读取文件前2字节,确认是
解压后验证
如果你已经做了解压操作,直接判断解压后的文件是否为tar归档即可:
普通gzip解压后得到的是原始的单个业务文件,而TarGzip解压后得到的是.tar格式的归档文件,再次用file命令或者tar工具校验即可,执行tar -tf <解压后的文件路径>如果能正常列出归档内的文件列表,就说明原文件是TarGzip格式。
内容的提问来源于stack exchange,提问作者Samarth Singhal
相关产品推荐
相关产品推荐

