我有一个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);
答案 0 :(得分:2)
从question that you link to,我知道你实际上有一个不同的问题。在那里你说Adler 32校验和是小端序,但应该是big-endian顺序。您还声明已经设法反转校验和的字节顺序,并且对大多数文件都可以正常工作。也就是说,您已经解决了此处描述的问题。但是你仍然有一些文件的校验和完全不正确。
我同意Mark Adler自己在对这个问题的评论中提出的建议:
你需要告诉那个.dat文件来自哪个错误。
和
您可以忽略错误并希望获得最佳效果。当阿德勒-32 检查不匹配,数据错误,Adler-32检查 错,或两者兼而有之。没有办法知道哪个。