智能客服
你问我答,随时在线为你解决问题
从API版本26.0.0开始,提供了缓冲区压缩解压缩能力,可以对内存中的整块数据进行一次性压缩或解压缩。主要适用于数据量较小且完整的场景,接口简单,操作快捷。
接口的详细说明,请参考oh_archive.h。
| 接口名称 | 描述 |
|---|---|
| OH_Archive_BufferWriteCompressBound(OH_Archive_CompressMethod method, uint64_t sourceLen) | 计算缓冲区压缩所需输出缓冲区大小。 |
| OH_Archive_BufferWrite(uint8_t *dstBuffer, uint64_t *dstSize, const uint8_t *srcBuffer, uint64_t srcSize, OH_Archive_CompressMethod method, int32_t compressLevel) | 对缓冲区数据进行压缩。 |
| OH_Archive_BufferRead(uint8_t *dstBuffer, uint64_t *dstSize, const uint8_t *srcBuffer, uint64_t srcSize, OH_Archive_CompressMethod method) | 对缓冲区数据进行解压缩。 |
在CMake脚本中链接动态库
CMakeLists.txt中添加以下lib。
target_link_libraries(sample PUBLIC liboharchive.so)
添加头文件
#include <filemanagement/archive/oh_archive.h>
static napi_value BufferCompress(napi_env env, napi_callback_info info)
{
// 获取输入文件路径和输出文件路径
size_t argc = 2;
napi_value argv[2] = {nullptr};
napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
size_t inPathSize;
size_t outPathSize;
char inPathBuf[PATH_BUFFER_SIZE];
char outPathBuf[PATH_BUFFER_SIZE];
napi_get_value_string_utf8(env, argv[0], inPathBuf, sizeof(inPathBuf), &inPathSize);
napi_get_value_string_utf8(env, argv[1], outPathBuf, sizeof(outPathBuf), &outPathSize);
CreateRandomFile(inPathBuf, 1024 * 1024); // 创建1024K大小的测试文件
// 读取文件数据到内存缓冲区
char *source = nullptr;
uint64_t sourceLen;
ReadFileData(inPathBuf, &source, &sourceLen);
uint64_t destLen = 0;
uint8_t *dest = nullptr;
// 计算压缩后数据所需的最大输出缓冲区大小
uint64_t bound = OH_Archive_BufferWriteCompressBound(OH_ARCHIVE_COMPRESS_DEFLATE, sourceLen);
if (bound > MALLOC_THRESHOLD) {
return nullptr;
}
dest = (uint8_t *)malloc(bound);
if (dest == nullptr) {
free(source);
return nullptr;
}
destLen = bound;
// 对缓冲区数据进行压缩,使用DEFLATE算法,压缩级别为0
OH_Archive_ErrCode ret = OH_Archive_BufferWrite(dest, &destLen, reinterpret_cast<uint8_t *>(source), sourceLen,
OH_ARCHIVE_COMPRESS_DEFLATE, 0);
free(source);
free(dest);
napi_value result = nullptr;
napi_create_int32(env, ret, &result);
return result;
} 准备输出缓冲区并调用OH_Archive_BufferRead解压缩数据。解压缩时需指定压缩数据缓冲区、输出缓冲区、数据长度和压缩算法,解压缩后的实际数据大小通过dstSize参数返回。建议压缩和解压缩使用相同的压缩算法参数。
static napi_value BufferDecompress(napi_env env, napi_callback_info info)
{
size_t argc = 0;
napi_get_cb_info(env, info, &argc, nullptr, nullptr, nullptr);
int ret;
// 生成随机测试数据
uint64_t dataSize = 1024 * 1024;
uint8_t *srcBuffer = (uint8_t *)malloc(dataSize);
if (srcBuffer == nullptr) {
return nullptr;
}
for (size_t i = 0; i < dataSize; ++i) {
srcBuffer[i] = static_cast<uint8_t>(TestRandomInt(0, 256)); // 小于256, byte范围内
}
// 先压缩数据,用于后续解压缩验证
uint64_t bound = OH_Archive_BufferWriteCompressBound(OH_ARCHIVE_COMPRESS_DEFLATE, dataSize);
uint64_t compressedSize = bound;
uint8_t *compressedBuffer = (uint8_t *)malloc(compressedSize);
if (compressedBuffer == nullptr) {
return nullptr;
}
ret = OH_Archive_BufferWrite(compressedBuffer, &compressedSize, srcBuffer, dataSize, OH_ARCHIVE_COMPRESS_DEFLATE,
int32_t(6)); // 压缩等级为6
// 分配解压缩输出缓冲区并执行解压缩
uint8_t *decompressedBuffer = (uint8_t *)malloc(dataSize);
if (decompressedBuffer == nullptr) {
return nullptr;
}
uint64_t decompressedSize = dataSize;
ret = OH_Archive_BufferRead(decompressedBuffer, &decompressedSize, compressedBuffer, compressedSize,
OH_ARCHIVE_COMPRESS_DEFLATE);
// 校验解压缩后的数据与原始数据是否一致
bool isEqual = std::memcmp(decompressedBuffer, srcBuffer, dataSize) == 0;
free(srcBuffer);
free(compressedBuffer);
free(decompressedBuffer);
napi_value result = nullptr;
napi_create_int32(env, !isEqual, &result);
return result;
} 缓冲区压缩解压缩:验证压缩后再解压缩的数据与原始数据完全一致,无数据丢失。