问题描述
我有一个文件,里面有 zlib deflate
d 个 4096 字节的块.我能够使用 C++ 至少膨胀 1 个 4096 字节的块,使用 Minzip 的 inflate
实现,没有乱码文本或 data error
.
I've got a file that has zlib deflate
d blocks of 4096 bytes. I'm able to inflate at least 1 block of 4096 bytes with C++, using Minzip's inflate
implementation, without garbled text or data error
.
我正在使用以下 C++ 实现来扩充数据:
I'm using the following C++ implementation to inflate the data:
#define DEC_BUFFER_LEN 20000
int main(int argc, char* argv[]) {
FILE *file = fopen("unpackme.3di", "rb");
char *buffer = new char[4096];
std::fstream outputFile;
outputFile.open("output.txt", std::ios_base::out | std::ios_base::trunc | std::ios_base::binary);
// Data zit nu in de buffer
char *decbuffer = new char[DEC_BUFFER_LEN];
mz_streamp streampie = new mz_stream();
streampie->zalloc = Z_NULL;
streampie->zfree = Z_NULL;
streampie->opaque = Z_NULL;
streampie->avail_in = Z_NULL;
streampie->next_in = Z_NULL;
if (inflateInit(streampie) != Z_OK)
return -1;
fread(buffer, 1, 4096, file);
streampie->next_in = (Byte *)&buffer[0];
streampie->avail_in = 4096;
streampie->next_out = (Byte *)&decbuffer[0];
streampie->avail_out = DEC_BUFFER_LEN;
streampie->total_out = 0;
int res = inflate(streampie, Z_NO_FLUSH);
if (res != Z_OK && res != Z_STREAM_END) {
std::cout << "Error: " << streampie->msg << std::endl;
return;
}
outputFile.write(decbuffer, streampie->total_out); // Write data to file
fclose(file);
inflateEnd(streampie);
outputFile.flush();
outputFile.close();
getchar();
return 0;
}
我正在使用以下 PHP 实现:
and I'm using the following PHP implementation:
function Unpack3DI($inputFilename) {
$handle = fopen($inputFilename, 'rb');
if ($handle === false) return null;
$data = gzinflate(fread($handle, 4096));
return $data;
}
var_dump(Unpack3DI('unpackme.3di'));
结果:
Warning: gzinflate() [function.gzinflate]: data error in /var/www/html/3di.php on line 9
bool(false)
推荐答案
问题是我使用了错误的函数.我不得不使用 gzuncompress
而不是 gzinflate
.此外,在 gzuncompress
中推送整个文件实际上做得很好,因为 zlib 检查是否有剩余的块要解压缩.
The issue was that I used the wrong function. I had to use gzuncompress
instead of gzinflate
.Also, pushing the whole file in gzuncompress
did the job very well actually, as zlib checks if there are remaining blocks to be uncompressed.
有关 PHP 中 Zlib 方法的更多信息在 这个回答PHP 中使用哪种压缩方法?".
More information about the Zlib methods in PHP are answered in this answer to "Which compression method to use in PHP?".
这篇关于ZLIB 膨胀在 PHP 中给出“数据错误"的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!