文档管理中心

缓冲区压缩解压缩(C/C++)

场景介绍

从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。

收起
自动换行
深色代码主题
复制
  1. target_link_libraries(sample PUBLIC liboharchive.so)

添加头文件

收起
自动换行
深色代码主题
复制
  1. #include <filemanagement/archive/oh_archive.h>

开发步骤

缓冲区压缩

  1. 调用OH_Archive_BufferWriteCompressBound计算输出缓冲区大小。压缩前先调用此接口获取输出缓冲区所需大小,确保输出缓冲区足够容纳压缩后的数据。
  2. 调用OH_Archive_BufferWrite对缓冲区数据进行压缩。调用时需指定输入数据、输出缓冲区、数据长度、压缩算法和压缩级别。压缩后的实际数据大小通过dstSize参数返回。
收起
自动换行
深色代码主题
复制
  1. static napi_value BufferCompress(napi_env env, napi_callback_info info)
  2. {
  3. // 获取输入文件路径和输出文件路径
  4. size_t argc = 2;
  5. napi_value argv[2] = {nullptr};
  6. napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
  7. size_t inPathSize;
  8. size_t outPathSize;
  9. char inPathBuf[PATH_BUFFER_SIZE];
  10. char outPathBuf[PATH_BUFFER_SIZE];
  11. napi_get_value_string_utf8(env, argv[0], inPathBuf, sizeof(inPathBuf), &inPathSize);
  12. napi_get_value_string_utf8(env, argv[1], outPathBuf, sizeof(outPathBuf), &outPathSize);
  13. CreateRandomFile(inPathBuf, 1024 * 1024); // 创建1024K大小的测试文件
  14. // 读取文件数据到内存缓冲区
  15. char *source = nullptr;
  16. uint64_t sourceLen;
  17. ReadFileData(inPathBuf, &source, &sourceLen);
  18. uint64_t destLen = 0;
  19. uint8_t *dest = nullptr;
  20. // 计算压缩后数据所需的最大输出缓冲区大小
  21. uint64_t bound = OH_Archive_BufferWriteCompressBound(OH_ARCHIVE_COMPRESS_DEFLATE, sourceLen);
  22. if (bound > MALLOC_THRESHOLD) {
  23. return nullptr;
  24. }
  25. dest = (uint8_t *)malloc(bound);
  26. if (dest == nullptr) {
  27. free(source);
  28. return nullptr;
  29. }
  30. destLen = bound;
  31. // 对缓冲区数据进行压缩,使用DEFLATE算法,压缩级别为0
  32. OH_Archive_ErrCode ret = OH_Archive_BufferWrite(dest, &destLen, reinterpret_cast<uint8_t *>(source), sourceLen,
  33. OH_ARCHIVE_COMPRESS_DEFLATE, 0);
  34. free(source);
  35. free(dest);
  36. napi_value result = nullptr;
  37. napi_create_int32(env, ret, &result);
  38. return result;
  39. }

缓冲区解压缩

准备输出缓冲区并调用OH_Archive_BufferRead解压缩数据。解压缩时需指定压缩数据缓冲区、输出缓冲区、数据长度和压缩算法,解压缩后的实际数据大小通过dstSize参数返回。建议压缩和解压缩使用相同的压缩算法参数。

收起
自动换行
深色代码主题
复制
  1. static napi_value BufferDecompress(napi_env env, napi_callback_info info)
  2. {
  3. size_t argc = 0;
  4. napi_get_cb_info(env, info, &argc, nullptr, nullptr, nullptr);
  5. int ret;
  6. // 生成随机测试数据
  7. uint64_t dataSize = 1024 * 1024;
  8. uint8_t *srcBuffer = (uint8_t *)malloc(dataSize);
  9. if (srcBuffer == nullptr) {
  10. return nullptr;
  11. }
  12. for (size_t i = 0; i < dataSize; ++i) {
  13. srcBuffer[i] = static_cast<uint8_t>(TestRandomInt(0, 256)); // 小于256, byte范围内
  14. }
  15. // 先压缩数据,用于后续解压缩验证
  16. uint64_t bound = OH_Archive_BufferWriteCompressBound(OH_ARCHIVE_COMPRESS_DEFLATE, dataSize);
  17. uint64_t compressedSize = bound;
  18. uint8_t *compressedBuffer = (uint8_t *)malloc(compressedSize);
  19. if (compressedBuffer == nullptr) {
  20. return nullptr;
  21. }
  22. ret = OH_Archive_BufferWrite(compressedBuffer, &compressedSize, srcBuffer, dataSize, OH_ARCHIVE_COMPRESS_DEFLATE,
  23. int32_t(6)); // 压缩等级为6
  24. // 分配解压缩输出缓冲区并执行解压缩
  25. uint8_t *decompressedBuffer = (uint8_t *)malloc(dataSize);
  26. if (decompressedBuffer == nullptr) {
  27. return nullptr;
  28. }
  29. uint64_t decompressedSize = dataSize;
  30. ret = OH_Archive_BufferRead(decompressedBuffer, &decompressedSize, compressedBuffer, compressedSize,
  31. OH_ARCHIVE_COMPRESS_DEFLATE);
  32. // 校验解压缩后的数据与原始数据是否一致
  33. bool isEqual = std::memcmp(decompressedBuffer, srcBuffer, dataSize) == 0;
  34. free(srcBuffer);
  35. free(compressedBuffer);
  36. free(decompressedBuffer);
  37. napi_value result = nullptr;
  38. napi_create_int32(env, !isEqual, &result);
  39. return result;
  40. }

调测验证关键点

缓冲区压缩解压缩:验证压缩后再解压缩的数据与原始数据完全一致,无数据丢失。