从InflaterInputStream中读取数据而不会膨胀

时间:2015-11-03 10:33:11

标签: java stream zlib

我有一个flate编码的数据流。 Adler-32检查要求数据采用Big-Endian形式,而我拥有的数据流采用小端格式。

我尝试使用Google-Guava的API

 byte[] filedata=ByteStreams.toByteArray(inflaterInputStream);

因为我需要字节操作以防数据采用little-endian格式。 但在将数据转换为字节数组期间,流会膨胀。因此"不正确的数据检查"扔了。

那么如何在不膨胀数据的情况下从InflaterInputstream读取数据,然后在充气之前对其进行修改,以便Adler-32检查通过,否则会引发数据完整性检查。

我有一个类似的问题here马克·阿德勒已经回复了,但我现在仍然坚持上述问题。

编辑: inflaterInputStream以这种方式创建:

int buflength = 4096; 
byte[] buf = new byte[buflength]; 
FileInputStream is = new FileInputStream(new File(filePath)); 
Inflater decompresser = new Inflater(); 
InflaterInputStream inflatterInputStream = new InflaterInputStream(is,decompresser,buflength);

1 个答案:

答案 0 :(得分:2)

question that you link to,我知道你实际上有一个不同的问题。在那里你说Adler 32校验和是小端序,但应该是big-endian顺序。您还声明已经设法反转校验和的字节顺序,并且对大多数文件都可以正常工作。也就是说,您已经解决了此处描述的问题。但是你仍然有一些文件的校验和完全不正确。

我同意Mark Adler自己在对这个问题的评论中提出的建议:

  

你需要告诉那个.dat文件来自哪个错误

  

您可以忽略错误并希望获得最佳效果。当阿德勒-32   检查不匹配,数据错误,Adler-32检查   错,或两者兼而有之。没有办法知道哪个。