在我們嵌入式開發(fā)中,通信中有些數據量較大的數據可以壓縮之后再進行傳輸。
壓縮算法有很多,常用的有如下幾種:
- lz4壓縮算法;zstd壓縮算法;xz壓縮算法;gzip壓縮算法
本次來介紹壓縮界的速度之王——lz4壓縮庫。一些數據如:
lz4源碼下載鏈接:http://security.ubuntu.com/ubuntu/pool/main/l/lz4/
lz4的使用
首先,從上面的鏈接中下載源碼進行編譯:
然后在源碼根目錄創(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);
測試例子:
把字符串"12345678901234567890123456789012345678901234567890"進行l(wèi)z4壓縮,再解壓,再把解壓之后的內容打印出來。
編寫測試代碼:
// 微信公眾號:嵌入式大雜燴
#include?<stdio.h>
#include?<stdlib.h>
#include?<string.h>
#include?<sys/time.h>
#include?<time.h>
#include?"lz4.h"
long?long?get_sys_time_us(void)
{
? ??longlong?time_us =?0;
? ??struct?timeval?sys_current_time;
? ? gettimeofday(&sys_current_time,?NULL);
? ? time_us = (longlong)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 = %dn", src0, src0_size);
? ??if?(src0_size < max_dst0_size)
? ? {
? ? ? ??longlong?compress_start_time = get_sys_time_us();
? ? ? ? dst0_compress_size = LZ4_compress_default(src0, dst0, src0_size, max_dst0_size);
? ? ? ??longlong?compress_end_time = get_sys_time_us();
? ? ? ??printf("after compress = %sn", dst0);
? ? ? ??printf("compress_time = %lld usn", compress_end_time - compress_start_time);
? ? }
else
? ? {
? ? ? ??printf("compress error! src0_size >= max_dst0_sizen");
? ? }
? ??// 解壓
? ??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 = %sn", src1);
? ? }
? ??else
? ? {
? ? ? ??printf("dst0_compress_size >= max_decompressed_sizen");
? ? }
? ??if?(compressed_size < max_decompressed_size)
? ? {
? ? ? ??longlong?decompress_start_time = get_sys_time_us();
? ? ? ? dst1_decompress_size = LZ4_decompress_safe(src1, dst1, compressed_size, max_decompressed_size);
? ? ? ??longlong?decompress_end_time = get_sys_time_us();
? ? ? ??printf("after decompress = %s, bytes = %dn", dst1, dst1_decompress_size);
? ? ? ??printf("decompress_time = %lld usn", decompress_end_time - decompress_start_time);
? ? }
else
? ? {
? ? ? ??printf("decompress error! compressed_size >= max_decompressed_sizen");
? ? }
return0;
}
編譯運行:
gcc -o lz4_test lz4_test.c -Llz4_x86_lib/lib -Ilz4_x86_lib/include -llz4
./lz4_test
更多實例可參照源碼路徑下的examples。
閱讀全文