我正在使用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。为什么呢?
答案 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文件的预期值。