Java DeflaterInputStream()到ZlibInflation 我目前在研究一个涉及java压缩和加密的项目,C++中的解密和通货膨胀。

Java DeflaterInputStream()到ZlibInflation 我目前在研究一个涉及java压缩和加密的项目,C++中的解密和通货膨胀。,java,c++,zlib,deflate,Java,C++,Zlib,Deflate,在我开始工作之前,我们使用java中的ZipoutStream创建压缩文件。这些文件将用ZLIB在C++中膨胀,只是使用ZLIP.C代码作为ZLIB上的一个例子。我们最近的转变是压缩这些文件,然后在存储到父zip之前进行加密。在这样做的过程中,我已经切换到使用Java中的DeflaterInputStream类来任意压缩字节,直到我有足够的字节用于分组密码 在切换到这个“DeflaterInputStream”类时,文件将不再使用ZLib膨胀。Zlib正在流上抛出一个“Z_数据_错误” 为了验证

在我开始工作之前,我们使用java中的ZipoutStream创建压缩文件。这些文件将用ZLIB在C++中膨胀,只是使用ZLIP.C代码作为ZLIB上的一个例子。我们最近的转变是压缩这些文件,然后在存储到父zip之前进行加密。在这样做的过程中,我已经切换到使用Java中的DeflaterInputStream类来任意压缩字节,直到我有足够的字节用于分组密码

在切换到这个“DeflaterInputStream”类时,文件将不再使用ZLib膨胀。Zlib正在流上抛出一个“Z_数据_错误”

为了验证到目前为止,我已经验证了加密逻辑是有效的。我可以使用“充气器”类在java中对文件进行充气。两个充气器类都只从一个解密块开始。我已经验证了密码的第一个块对于java和C++都是相同的。在我看来,DeflaterInputStream似乎没有输出真正的deflate格式?我不确定

编辑:澄清我的具体实施 PSEDOO代码示例:

Java(使用zpipe)

Java(不使用zpipe)

所以我基本上是使用DeflaterInputStream来压缩一个固定的大小,以输入密码,然后存储在存档中。我通过获取DeflaterInputStream和cipher的结果并写入文件,然后解密到明文缓冲区并使用Inflater类来处理,使它在java内部端到端地工作。据我所知,充气器和DeflaterInputStream类都处理原始deflate流,而不考虑或添加任何类型的归档头。我们使用C++中的自己的代码解析归档文件头和不输入到Ztube中的内容。 我希望Zlib/Zpipe能够处理我使用DeflaterInputStream创建的原始流,就像我使用一般的ZipEntry/zipoutpstream对象压缩一样

自从我尝试使用DeflaterInputStream以来,zlib/zpipe在尝试读取流时抛出了一个错误

更新

为了进一步排除故障,我执行了以下操作:

保存了DeflaterInputStream压缩文件的原始输出

在ZipoutStream/ZipEntry配对中使用相同的文件创建压缩的zip存档

使用十六进制编辑器删除本地文件头和归档文件的中心目录,只留下原始的deflate流

通过zpipe:Worked运行编辑的文件(原始放气流)

通过zpipe运行DeflaterInputStream输出:不工作

更新2

所以我只是比较了两者的输出。 DeflaterInputStream在流的开头给了我两个额外的字节。我不知道这些字节是什么。如果我用fseek()跳过它们,文件就会很好地解压缩。这些神秘字节的值是0x78 0x9C

更新3

在整个过程中,我一直在引用RFC1951,然而,看起来神奇的两个字节来自RFC1950。被名字“DeflaterInputStream”误导了

使用以下方法初始化DeflaterInputStream可以解决我的问题:

Deflater def = new Deflater(Deflater.DEFAULT_COMPRESSION,true);
DeflaterInputStream defIfs = new DeflaterInputStream(ifs,def);

非常感谢马克对这个问题的关注!Zlib是一个漂亮的项目。

ZipOutputStream
以zip格式生成输出。不是zlib、gzip或原始deflate格式,因此它不能用zpipe进行解压缩。你最初的前提毫无意义。对不起,我把它简化了。是ZipOutStream为父Zip对象创建本地文件头和CD信息,但是,流本身应该使用deflate格式进行压缩。我们使用ZipoutStream直接写入zip文件,但是,这应该相当于使用deflaterstream,计算CRC和文件大小,并在不压缩的情况下存储在存档中。我不清楚您在尝试什么。请更正您的问题,准确说明您正在做什么,您预期会发生什么,以及实际发生了什么。啊,抱歉造成混淆。我真的很感谢你的跟进!我在我原来的帖子中添加了一些内容,希望能澄清一些事情。感谢您提供的任何反馈/建议。您所说的“使用zpipe”到底是什么意思?该Java代码的结果是zpipe无法处理的zip文件。
FileOutputStream dest = new FileOutputStream("zipfile.zip");
ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(dest));

DeflaterInputStream deflater = new DeflaterInputStream("file_to_compress");

/* Redacted code to compress file, encrypt, write to file and calculate CRC 
Assume encryptedFile is a reference to the result of this process */


ZipEntry entry = new ZipEntry("filename");
entry.setCrc32(encryptedFile.getCrc32());
entry.setCompressedSize(encryptedFile.getLength());
entry.setMethod(ZipEntry.STORED); /* Should not try to compress encrypted file*/

out.putNextEntry(entry);
byte[] buf = new byte[1024];
int bytesRead;
while ((bytesRead = encryptedFile.read(buf)) > 0) {
    out.write(buf, 0, bytesRead);
}
out.closeEntry();
encryptedFile.close();
out.close();
Deflater def = new Deflater(Deflater.DEFAULT_COMPRESSION,true);
DeflaterInputStream defIfs = new DeflaterInputStream(ifs,def);