读取zlib/miniz压缩数据时出现数据错误 我正在编写一个简单的C++包,用于实现ZLIB压缩。我需要通货紧缩来工作,但现在我又遇到了数据膨胀的问题 代码

读取zlib/miniz压缩数据时出现数据错误 我正在编写一个简单的C++包,用于实现ZLIB压缩。我需要通货紧缩来工作,但现在我又遇到了数据膨胀的问题 代码,c++,io,compression,zlib,miniz,C++,Io,Compression,Zlib,Miniz,我有一个测试用例(大大简化)归结为: ByteArray randomData=createRandomData(1024*1024); ByteArray deflatedBytes=deflate(随机数据); writeToTmpFile(缩减字节);//供人工审核 ByteArray充气字节=充气(放气字节); 断言(randomData==膨胀字节); 我陷入了一个数据错误(-3),当我再次充气数据时返回该错误。 以下是出现问题的函数: //膨胀下一个字节并将其存储在 //将实际写入

我有一个测试用例(大大简化)归结为:

ByteArray randomData=createRandomData(1024*1024);
ByteArray deflatedBytes=deflate(随机数据);
writeToTmpFile(缩减字节);//供人工审核
ByteArray充气字节=充气(放气字节);
断言(randomData==膨胀字节);
我陷入了一个
数据错误(-3)
,当我再次充气数据时返回该错误。 以下是出现问题的函数:

//膨胀下一个字节并将其存储在
//将实际写入的金额存储在
结果代码充气器::充气(uint8\u t out[],大小,大小和书写)
{
zStream.next_out=out;
zStream.avail\u out=静态铸件(尺寸);
//循环,直到输出缓冲区完全填满
while(zStream.avail_out!=0){
如果(zStream.avail_in==0){
//我们的充气机存储一个ByteArrayInputStream
//我们要求更多的数据
size\u t read=iStream.read(in,BUFFER\u size);
if(iStream.err()){
返回ResultCode::STREAM\u错误;
}
zStream.next_in=in;
zStream.avail_in=静态_转换(读取);
}
//这就是我们称之为充气的地方。
//读取后返回结果代码-3(数据错误)
//只有13个字节。
结果代码结果{mz_充气(&zStream,Flushing::NONE)};
if(result==ResultCode::STREAM\u END){
写入=大小-zStream.avail\u out;
这->eof_u2;=真;
返回结果代码::OK;
}
else if(结果!=ResultCode::OK){
返回结果;
}
}
写入=大小-zStream.avail\u out;
返回结果代码::OK;
}
我的数据 我已在调试器中验证我读取的数据是否正确: 您可以看到
zStream
mz_流
中的
next_中有有效的zlib编码数据。至少它以
0x78
开头。 正如我在伪代码中提到的,我还将数据转储到磁盘。使用以下方法可以很好地读取此数据:

#此命令包含在qpdf包中,用于解压缩zlib流
zlib平板-解压缩<'mve_deflOutput.zlib'>'mve_deflOutput.bin'
这也是第一个字节的十六进制转储:

00000000: 7801 a4dd fb7f cfe5 1b07 7072 c8a9 9632  x.........pr...2
00000010: 49ac 9043 9a4c 392c 462c 4d88 8ab0 4a7c  I..C.L9,F,M...J|
00000020: 55d6 2c6d 6921 0931 34ad 4db5 8898 1c26  U.,mi!.14.M....&
00000030: 3a88 ce69 51d9 6a52 94a8 302d d252 6ba6  :..iQ.jR..0-.Rk.
00000040: 84a2 b2ef 9ff0 fce1 be7f dd63 dbe7 f37e  ...........c...~
00000050: dff7 75bd aed7 eb75 5df7 11ac 4358 3763  ..u....u]...CX7c
00000060: b5c0 ea88 550f ab33 d62e aca7 b132 b116  ....U..3.....2..
00000070: 611d c73a 8935 096b 0d56 05d6 8758 a3b1  a..:.5.k.V...X..
00000080: f0ef d7b4 c5c2 bfff f027 2c3c be93 b5b1  .........',<....
00000090: cec2 1a80 7531 5612 d68d 583b b0d6 622d  ....u1V...X;..b-
00000000:7801 a4dd fb7f cfe5 1b07 7072 c8a9 9632 x…pr…2
00000010:49ac 9043 9a4c 392c 462c 4d88 8ab0 4a7c I..C.L9,F,M..J|
00000020:55d6 2c6d 6921 0931 34ad 4db5 8898 1c26 U.,密歇根州!。14.M&
00000030:3a88 ce69 51d9 6a52 94a8 302d d252 6ba6:…iQ jR..0-.Rk。
00000040:84a2 b2ef 9ff0 fce1 be7f dd63 dbe7 f37e~
00000050:DFF775BD aed7 eb75 5DF71AC 43583763..u..u]…CX7c
00000060:b5c0 ea88 550f ab33 d62e aca7 b132 b116…U..3..2。。
00000070:611d c73a 8935 096b 0d56 05d6 8758 a3b1 a.:.5.k.V..X。。

00000080:f0ef d7b4 c5c2 bfff f027 2c3c be93 b5b1………,这是一个平淡无奇的解决方案,但事实证明,我应该使用实际的,而不是单头镜像。该单头库使用的是2017年的严重过时版本,无法正确读取数据

使用实际的
miniz
时,测试通过,一切正常。我的代码是100%正确的,它只是使用了错误的库