0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

什么是lz4?

汽车电子技术 来源:嵌入式大杂烩 作者: 杂烩君 2023-02-09 16:39 次阅读

大家好,我是杂烩君。

嵌入式大杂烩周记主要是一些实用项目学习分享,内容主要来源于我们之前收集的资料

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。

如果觉得文章有帮助,麻烦帮忙点赞、收藏、转发,谢谢!

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5060

    文章

    18983

    浏览量

    302288
  • 通信
    +关注

    关注

    18

    文章

    5952

    浏览量

    135801
  • 压缩
    +关注

    关注

    2

    文章

    101

    浏览量

    19352
收藏 人收藏

    评论

    相关推荐

    RK3326平台系统在编译中找不到 lz4是怎么回事

    RK3326平台系统在编译中找不到 lz4是怎么回事?怎样去解决呢?
    发表于 02-18 07:56

    RK3288 android 11编译报LZ4的错误怎么解决?

    RK3288 android 11编译报LZ4的错误怎么解决?
    发表于 03-03 06:45

    基于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:25

    【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 压缩算法。
    的头像 发表于 03-26 15:15 2797次阅读

    开源软件-LZ4无损压缩算法

    ./oschina_soft/lz4.zip
    发表于 06-23 15:21 0次下载
    开源软件-<b class='flag-5'>LZ4</b>无损压缩算法

    RK3568J lz4 tool

    采用Rockchip RK3588新一代旗舰级八核64位处理器,最大可配32GB大内存;支持8K视频编解码;拥有丰富的接口,支持多硬盘、千兆网、WiFi6、5G/4G扩展和多种视频输入输出;支持多种操作系统;可适用于ARM PC、边缘计算、云服务器、智能NVR等领域。
    发表于 06-29 11:21 0次下载
    RK3568J <b class='flag-5'>lz4</b> tool

    PostgreSQL 14中TOAST的新压缩算法LZ4,它能有多快?

    PG14之前版本,TOAST仅支持一个压缩算法PGLZ(PG内置算法)。但是其他压缩算法可能比PGLZ更快或者有更高的压缩率。PG14中有了新压缩选项LZ4压缩,这是一个以速度著称的无损压缩算法。因此我们可以期望它有助于提高TOAST压缩和解压缩的速度。
    的头像 发表于 01-24 15:54 1736次阅读
    PostgreSQL 14中TOAST的新压缩算法<b class='flag-5'>LZ4</b>,它能有多快?

    数据压缩算法的介绍

    在RPC通信数据的传输场景下,当通信报文数据传输较大时,会对数据包进行压缩传输,根据不同传输场景,常用的压缩算法有Zlib、Gzip、Bzip2、Deflater、Lz4、Lzo、Snappy算法等。以下将包括算法的介绍、Java实现代码以及各算法间的模拟性能对比。
    的头像 发表于 02-28 14:25 1241次阅读
    数据压缩算法的介绍