我有一个使用 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 个字节,但结果是一样的。
任何帮助将不胜感激。
删除
{ raw: true }
。你有一个 zlib 流,而不是原始流。