0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

什么是lz4?

汽車電子技術(shù) ? 來源:嵌入式大雜燴 ? 作者: 雜燴君 ? 2023-02-09 16:39 ? 次閱讀

大家好,我是雜燴君。

嵌入式大雜燴周記主要是一些實用項目學(xué)習(xí)分享,內(nèi)容主要來源于我們之前收集的資料

https://gitee.com/zhengnianli/EmbedSummary

本期主角:lz4

在我們嵌入式開發(fā)中,通信中有些數(shù)據(jù)量較大的數(shù)據(jù)可以壓縮之后再進(jìn)行傳輸。

壓縮算法有很多,常用的有如下幾種:

  • lz4壓縮算法
  • zstd壓縮算法
  • xz壓縮算法
  • gzip壓縮算法

本次來介紹壓縮界的速度之王——lz4壓縮庫。一些數(shù)據(jù)如:

圖片

lz4源碼下載鏈接:

http://security.ubuntu.com/ubuntu/pool/main/l/lz4/

lz4的使用

首先,從上面的鏈接中下載源碼進(jìn)行編譯:

圖片

然后在源碼根目錄創(chuàng)建一個文件夾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);

測試?yán)樱?/p>

把字符串"12345678901234567890123456789012345678901234567890"進(jìn)行l(wèi)z4壓縮,再解壓,再把解壓之后的內(nèi)容打印出來。

編寫測試代碼:

左右滑動查看全部代碼>>>

// 微信公眾號:嵌入式大雜燴
#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;
}

編譯運(yùn)行:

gcc -o lz4_test lz4_test.c -Llz4_x86_lib/lib -Ilz4_x86_lib/include -llz4
./lz4_test

圖片

更多實例可參照源碼路徑下的examples。

如果覺得文章有幫助,麻煩幫忙點贊、收藏、轉(zhuǎn)發(fā),謝謝!

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5052

    文章

    18914

    瀏覽量

    300847
  • 通信
    +關(guān)注

    關(guān)注

    18

    文章

    5926

    瀏覽量

    135706
  • 壓縮
    +關(guān)注

    關(guān)注

    2

    文章

    100

    瀏覽量

    19337
收藏 人收藏

    評論

    相關(guān)推薦

    RK3326平臺系統(tǒng)在編譯中找不到 lz4是怎么回事

    RK3326平臺系統(tǒng)在編譯中找不到 lz4是怎么回事?怎樣去解決呢?
    發(fā)表于 02-18 07:56

    RK3288 android 11編譯報LZ4的錯誤怎么解決?

    RK3288 android 11編譯報LZ4的錯誤怎么解決?
    發(fā)表于 03-03 06:45

    基于RK3588 debian搭建一種Kernel編譯環(huán)境

    lz4 apt install python pip scp 本機(jī)的 .ssh 文件夾到板端,然后 git clone kernel 代碼 編譯代碼 make ARCH=arm64 rockchip_linux_defconfig time make ARCH=arm64 rk3588-xxx.img -j16
    發(fā)表于 04-02 18:04

    【ELT.ZIP】OpenHarmony啃論文俱樂部——快速隨機(jī)訪問字符串壓縮

    ——人工智能短字符串壓縮++???5月22日 ++【ELT.ZIP】OpenHarmony啃論文俱樂部——多層存儲分級數(shù)據(jù)壓縮++【本期看點】FSST思想內(nèi)核FSST的演化FSST與LZ4對比親手復(fù)現(xiàn)FSST
    發(fā)表于 07-25 19:25

    【ELT.ZIP】OpenHarmony啃論文俱樂部—硬件加速的快速無損壓縮

    日?++【ELT.ZIP】OpenHarmony啃論文俱樂部——快速隨機(jī)訪問字符串壓縮++【本期看點】LZ4回顧對于數(shù)據(jù)格式的改進(jìn)對于哈希計算的優(yōu)化優(yōu)化后硬件架構(gòu)【技術(shù)DNA】【智慧場景
    發(fā)表于 07-30 09:08

    【ELT.ZIP】OpenHarmony啃論文俱樂部—數(shù)據(jù)密集型應(yīng)用內(nèi)存壓縮

    ,通過內(nèi)存數(shù)據(jù)中經(jīng)常觀察到的特征來加快 LZ4 算法輸入流的掃描;其次,針對 LZ4 算法,作者修改了其編碼方案,使其壓縮后的數(shù)據(jù)能夠以更簡潔的形式表示,結(jié)果表明,LZ4m 在壓縮和解壓縮的速度上分別比
    發(fā)表于 07-30 09:12

    【學(xué)習(xí)打卡】【ELT.ZIP】OpenHarmony啃論文俱樂部—硬件加速的快速無損壓縮

    日?++【ELT.ZIP】OpenHarmony啃論文俱樂部——快速隨機(jī)訪問字符串壓縮++【本期看點】LZ4回顧對于數(shù)據(jù)格式的改進(jìn)對于哈希計算的優(yōu)化優(yōu)化后硬件架構(gòu)【技術(shù)DNA】【智慧場景
    發(fā)表于 07-30 09:16

    【學(xué)習(xí)打卡】【ELT.ZIP】OpenHarmony啃論文俱樂部—數(shù)據(jù)密集型應(yīng)用內(nèi)存壓縮

    ,通過內(nèi)存數(shù)據(jù)中經(jīng)常觀察到的特征來加快 LZ4 算法輸入流的掃描;其次,針對 LZ4 算法,作者修改了其編碼方案,使其壓縮后的數(shù)據(jù)能夠以更簡潔的形式表示,結(jié)果表明,LZ4m 在壓縮和解壓縮的速度上分別比
    發(fā)表于 07-30 09:21

    RK3588 Android系統(tǒng)編譯命令

    c: not foundmake[]: *** [arch/arm64/boot/Image.lz4]errormake: *** [Image.lz4]error很明顯lz4命令沒有找到,需要安裝
    發(fā)表于 09-20 16:55

    怎么去解決ITX-3588J_Android12_HDMI編譯失敗的問題呢?

    'rk3588-firefly-itx-3588j.img' failed然后執(zhí)行編譯LZ4 時報錯,未找到解決方法mmm external/lz4/[hardware/rockchip/libgralloc] 31error: external
    發(fā)表于 02-22 16:15

    Linux 5.7將支持Zstd壓縮算法

    Linux 5.6 引入了可選的 F2FS 透明數(shù)據(jù)壓縮支持,并通過 LZO 和 LZ4 壓縮算法實現(xiàn)?,F(xiàn)在,Linux 5.7 內(nèi)核正在支持 Zstd 壓縮算法。
    的頭像 發(fā)表于 03-26 15:15 ?2778次閱讀

    開源軟件-LZ4無損壓縮算法

    ./oschina_soft/lz4.zip
    發(fā)表于 06-23 15:21 ?0次下載
    開源軟件-<b class='flag-5'>LZ4</b>無損壓縮算法

    RK3568J lz4 tool

    采用Rockchip RK3588新一代旗艦級八核64位處理器,最大可配32GB大內(nèi)存;支持8K視頻編解碼;擁有豐富的接口,支持多硬盤、千兆網(wǎng)、WiFi6、5G/4G擴(kuò)展和多種視頻輸入輸出;支持多種操作系統(tǒng);可適用于ARM PC、邊緣計算、云服務(wù)器、智能NVR等領(lǐng)域。
    發(fā)表于 06-29 11:21 ?0次下載
    RK3568J <b class='flag-5'>lz4</b> tool

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

    PG14之前版本,TOAST僅支持一個壓縮算法PGLZ(PG內(nèi)置算法)。但是其他壓縮算法可能比PGLZ更快或者有更高的壓縮率。PG14中有了新壓縮選項LZ4壓縮,這是一個以速度著稱的無損壓縮算法。因此我們可以期望它有助于提高TOAST壓縮和解壓縮的速度。
    的頭像 發(fā)表于 01-24 15:54 ?1663次閱讀
    PostgreSQL 14中TOAST的新壓縮算法<b class='flag-5'>LZ4</b>,它能有多快?

    數(shù)據(jù)壓縮算法的介紹

    在RPC通信數(shù)據(jù)的傳輸場景下,當(dāng)通信報文數(shù)據(jù)傳輸較大時,會對數(shù)據(jù)包進(jìn)行壓縮傳輸,根據(jù)不同傳輸場景,常用的壓縮算法有Zlib、Gzip、Bzip2、Deflater、Lz4、Lzo、Snappy算法等。以下將包括算法的介紹、Java實現(xiàn)代碼以及各算法間的模擬性能對比。
    的頭像 發(fā)表于 02-28 14:25 ?1204次閱讀
    數(shù)據(jù)壓縮算法的介紹