如何检测文件上使用的压缩类型?(如果未指定文件扩展名)



如何检测文件上使用的压缩类型?(假设未指定.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
}

相关内容

最新更新