在 React Native 中还原通过 compress2() 进行的 zlib 压缩时出现问题

问题描述 投票:0回答:1

我有一个使用 zlib 中的 compress2() 在 QT 中压缩的二进制文件,如以下源代码所示。

QByteArray qCompress(const uchar* data, int nbytes, int compressionLevel)
{
    if (nbytes == 0) {
        return QByteArray(4, '\0');
    }
    if (!data) {
        qWarning("qCompress: Data is null");
        return QByteArray();
    }
    if (compressionLevel < -1 || compressionLevel > 9)
        compressionLevel = -1;
    ulong len = nbytes + nbytes / 100 + 13;
    QByteArray bazip;
    int res;
    do {
        bazip.resize(len + 4);
        res = ::compress2((uchar*)bazip.data()+4, &len, data, nbytes, compressionLevel);
        switch (res) {
        case Z_OK:
            bazip.resize(len + 4);
            bazip[0] = (nbytes & 0xff000000) >> 24;
            bazip[1] = (nbytes & 0x00ff0000) >> 16;
            bazip[2] = (nbytes & 0x0000ff00) >> 8;
            bazip[3] = (nbytes & 0x000000ff);
            break;
        case Z_MEM_ERROR:
            qWarning("qCompress: Z_MEM_ERROR: Not enough memory");
            bazip.resize(0);
            break;
        case Z_BUF_ERROR:
            len *= 2;
            break;
        }
    } while (res == Z_BUF_ERROR);
    return bazip;
}

现在,我需要在我的 React Native 应用程序中解压它。为此,我正在使用“react-zlib-js”并尝试使用 inflate() 方法。

const zlib = require("react-zlib-js");
import { writeFile, readFile } from "react-native-fs";

async function decompressBinaryDatabaseFile() {
    try {
      const buffer = await readFile(fullBinaryFileName, "base64");

      await zlib.inflate(buffer, { raw: true }, (err: any, result: string) => {
        if (err) {
          console.log("Error decompressing database file: ", err);
        } else {
          console.log("Decompressed database file: ", result);
          writeFile(fullDatabaseFileName, result, "base64")
            .then((success) => {
              console.log("FILE WRITTEN!");
              openDatabase();
            })
            .catch((err) => {
              console.log(err.message);
            });
        }
      });
    } catch (error) {
      console.log("Error decompressing database file: ", error);
    }
  }

调用上面的函数时,我得到“错误:不正确的标题检查”。我还尝试了 zlib 页面中的其他方法,例如 inflateSync、inflateRaw、gunzip 等。我也试过切片缓冲区,删除数组的前 4 个字节,但结果是一样的。

任何帮助将不胜感激。

react-native qt zlib
1个回答
0
投票

删除

{ raw: true }
。你有一个 zlib 流,而不是原始流。

© www.soinside.com 2019 - 2024. All rights reserved.