ZLIB 膨胀在 PHP 中给出"数据错误"



我有一个文件,它有4096字节的zlib deflate d块。我能够用c++膨胀至少一个4096字节的块,使用Minzip的inflate实现,没有乱码文本或data error

我使用下面的c++实现来膨胀数据:

#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实现:

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检查是否有剩余的块需要解压缩。

关于PHP中Zlib方法的更多信息,请参见"在PHP中使用哪种压缩方法?".

最新更新