如何检测文件上使用的压缩类型?(假设未指定.zip、.gz、.xz 或任何其他扩展名(。
此信息是否存储在该文件的标头中的某个位置?
您可以通过查看前几个字节来确定它可能是这些格式之一。 然后,您应该测试它是否真的是其中之一,使用该格式的相关实用程序的完整性检查,或者实际进行解压缩。
您可以在说明中找到标题格式:
- Zip (.zip( 格式描述,以 0x50、0x4b、0x03、0x04开头(除非为空 — 则最后两个是0x05、0x06或0x06,0x06(
- Gzip (.gz( 格式说明,以 0x1f、0x8b 0x08开头
- xz (.xz( 格式说明,以 0xfd、0x37、0x7a、0x58、0x5a 0x00开头
别人:
- zlib (.zz( 格式描述,以两个字节(以位为单位(0aaa1000 BBBCCCC开头,其中选择CCCCC以使第一个被视为int16的字节乘以256加上被视为int16的第二个字节是31的倍数。 例如:01111000(位(= 120(int16(,10011100(位(= 156
- (int16(,120 * 256 + 156 = 30876,这是31的倍数
- 压缩 (.Z( 以 0x1f 开头,0x9d
- bzip2 (.bz2( 以 0x42、0x5a 0x68 开头
- Zstandard (.zstd( 格式说明,帧以 4 字节幻数开头,使用小端格式
0xFD2FB528
,可跳过帧以0x184D2A5?
开头(问号是从 0 到 F 的任何值(,字典以0xEC30A437
开头。 - 来自
file
命令的魔术数据库中的更多格式
如果你使用的是Linux机器,只需使用"file"命令。
http://en.wikipedia.org/wiki/File_(命令(
$ mv foo.zip dink
$ file dink
dink: gzip compressed data, from Unix, last modified: Sat Aug 6 08:08:57 2011,
max compression
$
作为手动检查文件头的替代方法,您可以使用一些实用程序,如 TrID。链接指向跨平台命令行版本;对于Windows,也有一个GUI。
如果要确定用于压缩 linux 内核的算法,有一个脚本,请参阅以下问题和答案:https://unix.stackexchange.com/a/553192/264065
在 golang 中实现 gzip 压缩检查的简单实现
func IsGzipCompressed(data []byte) bool {
gzipHeaderSize := 10
if len(data) < gzipHeaderSize {
return false
}
gzipHeaderMagicNumber := []byte{0x1f, 0x8b}
if bytes.Equal(data[:2], gzipHeaderMagicNumber) {
return true
}
return false
}