本文介绍了ZLIB 膨胀在 PHP 中给出“数据错误"的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个文件,里面有 zlib deflated 个 4096 字节的块.我能够使用 C++ 至少膨胀 1 个 4096 字节的块,使用 Minzip 的 inflate 实现,没有乱码文本或 data error.

I've got a file that has zlib deflated 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 中给出“数据错误"的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-01 16:36