ZLIB 膨胀在 PHP 中给出“数据错误" [英] ZLIB inflate give 'data error' in PHP
问题描述
我有一个文件,里面有 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 中给出“数据错误"的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!