大家好,我是杂烩君。
嵌入式大杂烩周记主要是一些实用项目学习分享,内容主要来源于我们之前收集的资料:
https://gitee.com/zhengnianli/EmbedSummary
本期主角:lz4
在我们嵌入式开发中,通信中有些数据量较大的数据可以压缩之后再进行传输。
压缩算法有很多,常用的有如下几种:
- lz4压缩算法
- zstd压缩算法
- xz压缩算法
- gzip压缩算法
本次来介绍压缩界的速度之王——lz4压缩库。一些数据如:

lz4源码下载链接:
http://security.ubuntu.com/ubuntu/pool/main/l/lz4/
lz4的使用
首先,从上面的链接中下载源码进行编译:

然后在源码根目录创建一个文件夹lz4_x86_lib:

编译lz4:
make
make install PREFIX=$(pwd)/lz4_x86_lib

得到:

lz4库交叉编译可参照:https://blog.csdn.net/nh5431313/article/details/106387168
lz4库有几套压缩、解压接口,我们使用最简单的接口:
int LZ4_compress_default(const char* source, char* dest, int sourceSize, int maxDestSize);
int LZ4_decompress_safe (const char* source, char* dest, int compressedSize, int maxDecompressedSize);
测试例子:
把字符串"12345678901234567890123456789012345678901234567890"进行lz4压缩,再解压,再把解压之后的内容打印出来。
编写测试代码:
左右滑动查看全部代码>>>
// 微信公众号:嵌入式大杂烩
#include
#include
#include
#include
#include
#include "lz4.h"
long long get_sys_time_us(void)
{
long long time_us = 0;
struct timeval sys_current_time;
gettimeofday(&sys_current_time, NULL);
time_us = (long long)sys_current_time.tv_sec*1000000 + sys_current_time.tv_usec;
return time_us;
}
int main(int arc, char *argv[])
{
// 压缩
char *src0 = "12345678901234567890123456789012345678901234567890";
char dst0[64] = {0};
int src0_size = strlen(src0) + 1;
int max_dst0_size = sizeof(dst0);
int dst0_compress_size = 0;
printf("before compress = %s, bytes = %d\\n", src0, src0_size);
if (src0_size < max_dst0_size)
{
long long compress_start_time = get_sys_time_us();
dst0_compress_size = LZ4_compress_default(src0, dst0, src0_size, max_dst0_size);
long long compress_end_time = get_sys_time_us();
printf("after compress = %s\\n", dst0);
printf("compress_time = %lld us\\n", compress_end_time - compress_start_time);
}
else
{
printf("compress error! src0_size >= max_dst0_size\\n");
}
// 解压
char src1[64] = {0};
char dst1[64] = {0};
int compressed_size = dst0_compress_size;
int max_decompressed_size = sizeof(dst1);
int dst1_decompress_size = 0;
if (dst0_compress_size < max_decompressed_size)
{
memcpy(src1, dst0, dst0_compress_size);
printf("before decompress = %s\\n", src1);
}
else
{
printf("dst0_compress_size >= max_decompressed_size\\n");
}
if (compressed_size < max_decompressed_size)
{
long long decompress_start_time = get_sys_time_us();
dst1_decompress_size = LZ4_decompress_safe(src1, dst1, compressed_size, max_decompressed_size);
long long decompress_end_time = get_sys_time_us();
printf("after decompress = %s, bytes = %d\\n", dst1, dst1_decompress_size);
printf("decompress_time = %lld us\\n", decompress_end_time - decompress_start_time);
}
else
{
printf("decompress error! compressed_size >= max_decompressed_size\\n");
}
return 0;
}
编译运行:
gcc -o lz4_test lz4_test.c -Llz4_x86_lib/lib -Ilz4_x86_lib/include -llz4
./lz4_test

更多实例可参照源码路径下的examples。
如果觉得文章有帮助,麻烦帮忙点赞、收藏、转发,谢谢!
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
嵌入式
+关注
关注
5209文章
20655浏览量
336976 -
通信
+关注
关注
18文章
6450浏览量
140258 -
压缩
+关注
关注
2文章
103浏览量
20208
发布评论请先 登录
相关推荐
热点推荐
基于RK3588 debian搭建一种Kernel编译环境
lz4 apt install python pip scp 本机的 .ssh 文件夹到板端,然后 git clone kernel 代码 编译代码 make ARCH=arm64 rockchip_linux_defconfig time make ARCH=arm64 rk3588-xxx.img -j16
发表于 04-02 18:04
【学习打卡】【ELT.ZIP】OpenHarmony啃论文俱乐部——快速随机访问字符串压缩
——人工智能短字符串压缩++ ⑯ 5月22日 ++【ELT.ZIP】OpenHarmony啃论文俱乐部——多层存储分级数据压缩++【本期看点】FSST思想内核FSST的演化FSST与LZ4对比亲手复现FSST
发表于 07-25 19:27
【ELT.ZIP】OpenHarmony啃论文俱乐部—硬件加速的快速无损压缩
日 ++【ELT.ZIP】OpenHarmony啃论文俱乐部——快速随机访问字符串压缩++【本期看点】LZ4回顾对于数据格式的改进对于哈希计算的优化优化后硬件架构【技术DNA】【智慧场景
发表于 07-30 09:08
【ELT.ZIP】OpenHarmony啃论文俱乐部—数据密集型应用内存压缩
,通过内存数据中经常观察到的特征来加快 LZ4 算法输入流的扫描;其次,针对 LZ4 算法,作者修改了其编码方案,使其压缩后的数据能够以更简洁的形式表示,结果表明,LZ4m 在压缩和解压缩的速度上分别比
发表于 07-30 09:12
【学习打卡】【ELT.ZIP】OpenHarmony啃论文俱乐部—硬件加速的快速无损压缩
日 ++【ELT.ZIP】OpenHarmony啃论文俱乐部——快速随机访问字符串压缩++【本期看点】LZ4回顾对于数据格式的改进对于哈希计算的优化优化后硬件架构【技术DNA】【智慧场景
发表于 07-30 09:16
【学习打卡】【ELT.ZIP】OpenHarmony啃论文俱乐部—数据密集型应用内存压缩
,通过内存数据中经常观察到的特征来加快 LZ4 算法输入流的扫描;其次,针对 LZ4 算法,作者修改了其编码方案,使其压缩后的数据能够以更简洁的形式表示,结果表明,LZ4m 在压缩和解压缩的速度上分别比
发表于 07-30 09:21
RK3588 Android系统编译命令
c: not foundmake[]: *** [arch/arm64/boot/Image.lz4]errormake: *** [Image.lz4]error很明显lz4命令没有找到,需要安装
发表于 09-20 16:55
怎么去解决ITX-3588J_Android12_HDMI编译失败的问题呢?
'rk3588-firefly-itx-3588j.img' failed然后执行编译LZ4 时报错,未找到解决方法mmm external/lz4/[hardware/rockchip/libgralloc] 31error: external
发表于 02-22 16:15
Linux 5.7将支持Zstd压缩算法
Linux 5.6 引入了可选的 F2FS 透明数据压缩支持,并通过 LZO 和 LZ4 压缩算法实现。现在,Linux 5.7 内核正在支持 Zstd 压缩算法。
RK3568J lz4 tool
采用Rockchip RK3588新一代旗舰级八核64位处理器,最大可配32GB大内存;支持8K视频编解码;拥有丰富的接口,支持多硬盘、千兆网、WiFi6、5G/4G扩展和多种视频输入输出;支持多种操作系统;可适用于ARM PC、边缘计算、云服务器、智能NVR等领域。
发表于 06-29 11:21
•0次下载
PostgreSQL 14中TOAST的新压缩算法LZ4,它能有多快?
PG14之前版本,TOAST仅支持一个压缩算法PGLZ(PG内置算法)。但是其他压缩算法可能比PGLZ更快或者有更高的压缩率。PG14中有了新压缩选项LZ4压缩,这是一个以速度著称的无损压缩算法。因此我们可以期望它有助于提高TOAST压缩和解压缩的速度。
数据压缩算法的介绍
在RPC通信数据的传输场景下,当通信报文数据传输较大时,会对数据包进行压缩传输,根据不同传输场景,常用的压缩算法有Zlib、Gzip、Bzip2、Deflater、Lz4、Lzo、Snappy算法等。以下将包括算法的介绍、Java实现代码以及各算法间的模拟性能对比。
什么是lz4?
评论