区分GZIP和非GZIP格式不起作用

时间:2017-03-25 18:53:39

标签: java io gzip

我正在使用NBT扫描仪软件。它应该从有或没有GZIP压缩的文件中读取NBT数据。我使用以下代码来确定文件是否以GZIP格式压缩。假设它是有效的。 (我正在使用支持标记/重置的FileInputStream扩展名)

public static InputStream GZIPCheck(InputStream in) throws IOException{
    in.mark(1);
    int header = in.read();
    in.reset();
    if(header > Byte.MAX_VALUE){
        return new GZIPInputStream(in);
    }
    return in;
}

NBT格式的前缀是签名的短(任何值),不能为负数,GZIP格式以负短消息开头:

public final static int GZIP_MAGIC = 0x8b1f;

这使得很容易区分这两者。我读了第一个字节,如果它是负数,(无符号版本大于Byte.MAX_VALUE)那么它不能是NBT,所以我尝试GZIPInputStream。 (如果失败,那么该文件无效。)如果第一个字节为正,(或为零)则不能为GZIP,因为它与GZIP_MAGIC不一致,所以我不知道使用它。

这就是:我的方法总是返回in参数,无论我读到什么有效file。为什么呢?

1 个答案:

答案 0 :(得分:0)

http.ResponseWriter它执行以下操作

  

从输入流中读取下一个数据字节。值字节作为int返回,范围为0到255。

According to the API doc for InputStream.read() GZIP文件以ID1和ID2以及

开头
  

具有固定值ID1 = 31(0x1f,\ 037),ID2 = 139(0x8b,\ 213),以将文件标识为gzip格式。

在有效的GZIP文件上调用InputStream.read()将返回31或0x1f,一个字节,而不是由两个字节组成的整个幻数。由于31低于Byte.MAX_VALUE(即127),因此在有效GZIP文件的情况下,条件永远不会为真。

您应该考虑将ID1和ID2都检查为GZIP文件的预期值。