HarmonyOS 鸿蒙Next Deflater压缩算法

发布于 1周前 作者 yibo5220 来自 鸿蒙OS

HarmonyOS 鸿蒙Next Deflater压缩算法

在鸿蒙中有实现Deflater压缩的算法吗?

在Java中类似实现:

public static String deflaterCompress(byte[] unzipByte) {
Deflater deflater = new Deflater();
deflater.setInput(unzipByte);
deflater.finish();
final byte[] bytes = new byte[256];
ByteArrayOutputStream outputStream = new ByteArrayOutputStream(256);
while (!deflater.finished()) {
int length = deflater.deflate(bytes);
outputStream.write(bytes, 0, length);
}
deflater.end();
return Base64.encodeToString(outputStream.toByteArray(), Base64.DEFAULT);
}
<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>


更多关于HarmonyOS 鸿蒙Next Deflater压缩算法的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复
 这里查询相关资料 鸿蒙原生不支持Deflater压缩算法

但这这里咨询到 使用native 测调起 使用deflate函数进行压缩 以下位代码demo 实例

native侧
zlib库进行gzip压缩
当前ArkTs侧zlib暂不支持gzip压缩,可以使用基础库压缩,参考zlib Usage Example。
方案
​ 1)首先初始化z_stream结构体,然后设置输入数据和输出buffer的信息。
​ 2)接着使用deflateInit2函数初始化,并使用deflate函数进行压缩。如果输出buffer不足以存储所有压缩数据,则进行拓容并重复压缩的过程,直到所有数据压缩完毕。
​ 3)最后,返回压缩后的数据和数据大小,并使用deflateEnd函数释放。
​ 头文件:zlib.h
核心代码
char* compressToGzip(const char *input, int inputSize, int* outputSize) {
z_stream zs;
// 初始化 (主要用于自定义内存管理, 此处不使用, 应用有诉求可参考:https://www.zlib.net/manual.html)
zs.zalloc = Z_NULL; // 用于分配内部状态
zs.zfree = Z_NULL; // 用于释放内部状态
zs.opaque = Z_NULL; // 传递给 zalloc、zfree的私有数据对象
// 初始化输入数据
zs.next_in = (Bytef *)input; // 输入数据头
zs.avail_in = (uInt)inputSize; // 输入数据的内存块大小
// 初始化输出buffer
char *compressedData = new char[CHUNK_SIZE];
// 输出头
zs.next_out = (Bytef *)compressedData;
zs.avail_out = (uInt)CHUNK_SIZE;
// 开始压缩(此处使用空的gzip头)
int windowBits = WINDOWS_BITS; // windowBits历史缓冲区的大小,此参数的值越大,压缩效果越好。 范围(8-15)
// 特殊:windowBits加上 16,表示使用gzip头 windowBits加上 32,表示自动识别gzip/zlib头
int memLevel = 8; // memLevel=1使用最小内存但速度较慢,降低压缩比; memLevel=9使用最大内存以获得最佳速度 默认值为8
deflateInit2(&zs, Z_DEFAULT_COMPRESSION, Z_DEFLATED, windowBits, memLevel, Z_DEFAULT_STRATEGY);
// 压缩 尽量一次压缩完毕
deflate(&zs, Z_FINISH);
int chunkCount = 1; // 数据块的个数
// 重复压缩
while (zs.avail_out == 0) {
// 为输出数据 拓容
chunkCount++;
char* newBuffer = new char[CHUNK_SIZE*chunkCount];
// 复制历史数据
memcpy(newBuffer, compressedData, CHUNK_SIZE*(chunkCount-1));
delete[] compressedData;
compressedData = newBuffer;
// 继续压缩
zs.next_out = (Bytef *)(compressedData+CHUNK_SIZE*(chunkCount-1));
zs.avail_out = (uInt)CHUNK_SIZE;
deflate(&zs, Z_FINISH);
}
// 返回结果
*outputSize = zs.total_out;
deflateEnd(&zs);
return compressedData;
}<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>

更多关于HarmonyOS 鸿蒙Next Deflater压缩算法的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


关于HarmonyOS鸿蒙Next的Deflater压缩算法,以下是一些专业解答:

Deflater压缩算法在HarmonyOS中并非特指某一种具体的压缩技术,而更像是一个通用的术语,可能涵盖了多种压缩算法。在HarmonyOS中,图片压缩通常通过ImagePacker等API实现,这些API内部可能使用了包括Deflater在内的多种压缩算法。

对于Deflater压缩算法的具体性能、使用场景和优化方法,这通常取决于HarmonyOS的内部实现和设备的处理能力。一般来说,压缩算法的效率与压缩比、压缩速度和解压缩速度等因素有关。

需要注意的是,HarmonyOS作为一个复杂的操作系统,其压缩算法可能随着版本的更新而有所变化。因此,建议开发者在使用压缩算法时,务必参考最新的HarmonyOS开发文档和API说明。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部