Java 在不充气的情况下从充气输入流读取数据

Java 在不充气的情况下从充气输入流读取数据,java,stream,zlib,Java,Stream,Zlib,我有一个扁平编码的数据流。 Adler-32检查要求数据采用大端形式,而我拥有的数据流采用小端形式 我试着使用谷歌番石榴的API byte[] filedata=ByteStreams.toByteArray(inflaterInputStream); 因为我需要字节操作,以防数据是little endian格式。 但在将数据转换为字节数组的过程中,流会膨胀。因此会抛出“不正确的数据检查” 因此,如何从InflaterInputstream读取数据而不膨胀数据,然后在膨胀之前对其进行修改,以

我有一个扁平编码的数据流。 Adler-32检查要求数据采用大端形式,而我拥有的数据流采用小端形式

我试着使用谷歌番石榴的API

 byte[] filedata=ByteStreams.toByteArray(inflaterInputStream);
因为我需要字节操作,以防数据是little endian格式。 但在将数据转换为字节数组的过程中,流会膨胀。因此会抛出“不正确的数据检查”

因此,如何从InflaterInputstream读取数据而不膨胀数据,然后在膨胀之前对其进行修改,以使Adler-32检查通过,否则将抛出数据完整性检查

我有一个马克·阿德勒曾经回答过的类似问题,但我现在陷入了上述问题

编辑:
充气输入流的创建方式如下:

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);
从这个角度,我了解到你实际上有一个不同的问题。在这里,您声明Adler 32校验和是小端顺序,但应该是大端顺序。您还声明,您已经成功地反转了校验和的尾数,并且大多数文件都可以正常工作。也就是说,您已经解决了您在此处描述的问题。但是您仍然有一些文件的校验和完全不正确

我同意马克·阿德勒本人在对该问题的评论中提出的建议:

你需要告诉那个.dat文件的来源,它是错误的

以及:

你可以忽略错误,抱着最好的希望。当阿德勒-32 检查不匹配,或者数据错误,Adler-32检查不正确 错了,或者两者都错了。没有办法知道是哪个


如果您演示如何创建“InflaterInputStream”,可能会有所帮助;字节[]buf=新字节[buflength];FileInputStream为=新FileInputStream(新文件(文件路径));充气减压器=新充气器();充气输入流ifis=新充气输入流(is,减压器,buflength);我在另一个问题中提到的解决问题是通过十六进制编辑器手动编辑.dat文件中的内容。现在在这个问题中,我的情况是在解压开始之前通过代码对.dat文件执行相同的操作,以便adler-32检查不会失败。然后遵循adler的建议。告诉来源你从哪里得到的校验和是不正确的。在源代码修复校验和之前,请忽略Adler错误。校验和只是一个安全的东西,以确保文件在过程中的某个地方没有损坏。有没有一种方法可以在不解压缩的情况下读取充气机流的内容,即读取原始数据并将其保存到字节数组中,但是我怎样才能显式地将一个子类对象向下转换到它的基类,即从InfalterInputStream到FilterInputStream,因为这样做会抛出classcastexception。文件I/S和过滤器I/S位于同一级别,但如何将充气器I/S对象强制转换为文件I/S。请帮忙,你不需要。使用您已有的FileInputStream类型的变量
is
。您甚至可以创建一个FilterInputStream子类,该子类位于源和InflateInputStream之间。但是,所有这些都毫无用处。简单地忽略Adler-32检查就足够了。