压缩和归档库-LZ4介绍

1.简介

LZ4是一种快速的压缩算法,提供压缩和解压缩的速度,而牺牲了压缩率。它被设计用于快速的数据压缩和解压缩,特别是用于数据存储和传输。LZ4通常用于需要高速数据处理的场景,如数据库、日志文件处理和实时数据传输。

LZ4的特点是压缩和解压缩速度快,但压缩率不如其他一些压缩算法(如gzip或zstd)。

LZ4的工作原理是基于字典的压缩,它查找数据中的重复字符串,并用较短的形式来表示这些重复的部分。这种算法非常适合于有大量重复数据的情况。

以下是和其他压缩算法的比较:
在这里插入图片描述

2.环境搭建

下载地址:https://github.com/lz4/lz4/tree/v1.9.4
解压缩文件之后,进入到编译目录。
在这里插入图片描述
双击lz4.sln打开工程。
这里编译静态库,将lz4file.c和lz4file.h添加进工程中,编译好后生成liblz4_static.lib静态库。
在这里插入图片描述
拷贝include文件和生成的liblz4_static.lib静态库到我们的demo工程下。
在这里插入图片描述

最后在visual studio中添加include目录 和 lib目录即可。
配置visual studio环境,具体参考请看Jsoncpp介绍。

3.示例

压缩/解压缩文件

#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>extern "C"
{
#include "lz4.h"
#include "lz4file.h"
}#define CHUNK_SIZE (16*1024)static size_t get_file_size(char *filename)
{struct stat statbuf;if (filename == NULL) {return 0;}if (stat(filename, &statbuf)) {return 0;}return statbuf.st_size;
}static int compress_file(FILE* f_in, FILE* f_out)
{assert(f_in != NULL); assert(f_out != NULL);LZ4F_errorCode_t ret = LZ4F_OK_NoError;size_t len;LZ4_writeFile_t* lz4fWrite;void* const buf = malloc(CHUNK_SIZE);if (!buf) {printf("error: memory allocation failed \n");}/* Of course, you can also use prefsPtr to* set the parameters of the compressed file* NULL is use default*/ret = LZ4F_writeOpen(&lz4fWrite, f_out, NULL);if (LZ4F_isError(ret)) {printf("LZ4F_writeOpen error: %s\n", LZ4F_getErrorName(ret));free(buf);return 1;}while (1) {len = fread(buf, 1, CHUNK_SIZE, f_in);if (ferror(f_in)) {printf("fread error\n");goto out;}/* nothing to read */if (len == 0) {break;}ret = LZ4F_write(lz4fWrite, buf, len);if (LZ4F_isError(ret)) {printf("LZ4F_write: %s\n", LZ4F_getErrorName(ret));goto out;}}out:free(buf);if (LZ4F_isError(LZ4F_writeClose(lz4fWrite))) {printf("LZ4F_writeClose: %s\n", LZ4F_getErrorName(ret));return 1;}return 0;
}static int decompress_file(FILE* f_in, FILE* f_out)
{assert(f_in != NULL); assert(f_out != NULL);LZ4F_errorCode_t ret = LZ4F_OK_NoError;LZ4_readFile_t* lz4fRead;void* const buf = malloc(CHUNK_SIZE);if (!buf) {printf("error: memory allocation failed \n");}ret = LZ4F_readOpen(&lz4fRead, f_in);if (LZ4F_isError(ret)) {printf("LZ4F_readOpen error: %s\n", LZ4F_getErrorName(ret));free(buf);return 1;}while (1) {ret = LZ4F_read(lz4fRead, buf, CHUNK_SIZE);if (LZ4F_isError(ret)) {printf("LZ4F_read error: %s\n", LZ4F_getErrorName(ret));goto out;}/* nothing to read */if (ret == 0) {break;}if (fwrite(buf, 1, ret, f_out) != ret) {printf("write error!\n");goto out;}}out:free(buf);if (LZ4F_isError(LZ4F_readClose(lz4fRead))) {printf("LZ4F_readClose: %s\n", LZ4F_getErrorName(ret));return 1;}if (ret) {return 1;}return 0;
}int compareFiles(FILE* fp0, FILE* fp1)
{int result = 0;while (result == 0) {char b0[1024];char b1[1024];size_t const r0 = fread(b0, 1, sizeof(b0), fp0);size_t const r1 = fread(b1, 1, sizeof(b1), fp1);result = (r0 != r1);if (!r0 || !r1) break;if (!result) result = memcmp(b0, b1, r0);}return result;
}int main(int argc, const char **argv) 
{char inpFilename[256] = { 0 };char lz4Filename[256] = { 0 };char decFilename[256] = { 0 };if (argc < 2) {printf("Please specify input filename\n");return 0;}snprintf(inpFilename, 256, "%s", argv[1]);snprintf(lz4Filename, 256, "%s.lz4", argv[1]);snprintf(decFilename, 256, "%s.lz4.dec", argv[1]);printf("inp = [%s]\n", inpFilename);printf("lz4 = [%s]\n", lz4Filename);printf("dec = [%s]\n", decFilename);/* compress */{  FILE* const inpFp = fopen(inpFilename, "rb");FILE* const outFp = fopen(lz4Filename, "wb");printf("compress : %s -> %s\n", inpFilename, lz4Filename);LZ4F_errorCode_t ret = compress_file(inpFp, outFp);fclose(inpFp);fclose(outFp);if (ret) {printf("compression error: %s\n", LZ4F_getErrorName(ret));return 1;}printf("%s: %zu → %zu bytes, %.1f%%\n",inpFilename,get_file_size(inpFilename),get_file_size(lz4Filename), /* might overflow is size_t is 32 bits and size_{in,out} > 4 GB */(double)get_file_size(lz4Filename) / get_file_size(inpFilename) * 100);printf("compress : done\n");}/* decompress */{FILE* const inpFp = fopen(lz4Filename, "rb");FILE* const outFp = fopen(decFilename, "wb");printf("decompress : %s -> %s\n", lz4Filename, decFilename);LZ4F_errorCode_t ret = decompress_file(inpFp, outFp);fclose(outFp);fclose(inpFp);if (ret) {printf("compression error: %s\n", LZ4F_getErrorName(ret));return 1;}printf("decompress : done\n");}/* verify */{   FILE* const inpFp = fopen(inpFilename, "rb");FILE* const decFp = fopen(decFilename, "rb");printf("verify : %s <-> %s\n", inpFilename, decFilename);int const cmp = compareFiles(inpFp, decFp);fclose(decFp);fclose(inpFp);if (cmp) {printf("corruption detected : decompressed file differs from original\n");return cmp;}printf("verify : OK\n");}return 0;
}

生成可执行程序,添加两个参数。运行效果如下:
在这里插入图片描述

4.更多参考

libVLC 专栏介绍-CSDN博客

Qt+FFmpeg+opengl从零制作视频播放器-1.项目介绍_qt opengl视频播放器-CSDN博客

QCharts -1.概述-CSDN博客

Zlib介绍

压缩和归档库-miniz介绍

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/8971.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[NSSRound#1 Basic]basic_check

[NSSRound#1 Basic]basic_check 开题什么都没有&#xff0c;常规信息搜集也无效 发现题目允许PUT的两种做法&#xff1a; 1、 CURL的OPTIONS请求方法查看允许的请求方式 curl -v -X OPTIONS http://node4.anna.nssctf.cn:28545/index.php2、 kali自带的nikto工具扫描网址 Nik…

DetCLIPv3:面向多功能生成开放词汇的目标检测

DetCLIPv3:面向多功能生成开放词汇的目标检测 摘要IntroductionRelated worksMethod DetCLIPv3: Towards Versatile Generative Open-vocabulary Object Detection 摘要 现有的开词汇目标检测器通常需要用户预设一组类别&#xff0c;这大大限制了它们的应用场景。在本文中&…

新能源汽车充电站智慧充电电能服务综合解决方案

安科瑞薛瑶瑶18701709087/17343930412 ★解决方案 ✔目的地充电-EMS微电网平台 基于EMS解决方案从设备运维的角度解决本地充电的能量管理及运维问题&#xff0c;与充电管理平台打通数据&#xff0c;为企业微电网提供源、网、荷、储、充一体化解决方案。 ✔运营场站--电能服务…

python3有serial库吗

一、概述 pyserial模块封装了对串口的访问。 二、特性 在支持的平台上有统一的接口。 通过python属性访问串口设置。 支持不同的字节大小、停止位、校验位和流控设置。 可以有或者没有接收超时。 类似文件的API&#xff0c;例如read和write&#xff0c;也支持readline等…

基于Detectron2的计算机视觉实践

书籍&#xff1a;Hands-On Computer Vision with Detectron2: Develop object detection and segmentation models with a code and visualization approach 作者&#xff1a;Van Vung Pham&#xff0c;Tommy Dang 出版&#xff1a;Packt Publishing 书籍下载-《基于Detectr…

MySQL学习笔记11——数据备份 范式 ER模型

数据备份 & 范式 & ER模型 一、数据备份1、如何进行数据备份&#xff08;1&#xff09;备份数据库中的表&#xff08;2&#xff09;备份数据库&#xff08;3&#xff09;备份整个数据库服务器 2、如何进行数据恢复3、如何导出和导入表里的数据&#xff08;1&#xff09…

(二十一)springboot实战——Spring AI劲爆来袭

前言 本节内容是关于Spring生态新发布的Spring AI的介绍&#xff0c;Spring AI 是一个面向人工智能工程的应用框架。其目标是将 Spring 生态系统的设计原则&#xff0c;如可移植性和模块化设计&#xff0c;应用到人工智能领域&#xff0c;并推广使用普通的Java对象&#xff08…

雪球期权是什么意思?你了解雪球期权吗?

今天期权懂带你了解雪球期权是什么意思&#xff1f;你了解雪球期权吗&#xff1f;雪球期权属于场外期权的一种&#xff0c;交易的方式只能通过线下跟券商询价的方式进行&#xff0c;类似场外个股期权的交易方式。 雪球期权是什么意思&#xff1f; 雪球期权&#xff0c;顾名思义…

js逆向,参数加密js混淆

关键词 JS 混淆、源码乱码、参数动态加密 逆向目标 题目1&#xff1a;抓取所有&#xff08;5页&#xff09;机票的价格&#xff0c;并计算所有机票价格的平均值&#xff0c;填入答案。 目标网址&#xff1a;https://match.yuanrenxue.cn/match/1目标接口&#xff1a;https://ma…

SSE介绍(实现流式响应)

写在前面 本文一起来看下SSE相关内容。 1&#xff1a;SSE是什么 全称&#xff0c;server-send events&#xff0c;基于http协议&#xff0c;一次http请求&#xff0c;server端可以分批推送数据&#xff0c; 不同于websocket的全双工通信&#xff0c;SSM单向通信,一般应用于需…

如何利用IPIDEA代理IP优化数据采集效率?

一、 前言二、 IPIDEA介绍三、体验步骤四、实战训练五、结语 一、 前言 在全球化与信息化交织的当代社会&#xff0c;数据已成为驱动商业智慧与技术革新的核心引擎。网络&#xff0c;作为信息汇聚与交流的枢纽&#xff0c;不仅是人们获取知识的窗口&#xff0c;更是商业活动与技…

【数据结构】详解栈

今天我们主要来了解栈&#xff01;如果对知识点有模糊&#xff0c;可翻阅以往文章哦&#xff01; 个人主页&#xff1a;小八哥向前冲~-CSDN博客 所属专栏&#xff1a;数据结构【c语言版】_小八哥向前冲~的博客-CSDN博客 c语言专栏&#xff1a;c语言_小八哥向前冲~的博客-CSDN博…

树和二叉树的定义和基本术语

文章目录 前言一、树的定义二、树的基本术语三、二叉树的定义总结 前言 T_T此专栏用于记录数据结构及算法的&#xff08;痛苦&#xff09;学习历程&#xff0c;便于日后复习&#xff08;这种事情不要啊&#xff09;。所用教材为《数据结构 C语言版 第2版》严蔚敏。 一、树的定义…

win7开启远程桌面却连接不上,如何解决Win7系统开启远程桌面但无法连接的问题

在使用Win7系统时&#xff0c;有时候我们可能会遇到这样的问题&#xff1a;已经成功开启了远程桌面功能&#xff0c;但尝试连接时却总是失败。这可能是由于多种原因导致的&#xff0c;下面我们将详细分析并提供相应的解决方案。 确保本地网络连接正常 可以尝试通过Ping命令测试…

C++程序设计:C++的内存分布与管理

C的内存分布与管理 栈区堆区全局区代码区常量区 栈区 &#xff08;1&#xff09;什么是栈区&#xff1f; 栈区&#xff08;Stack&#xff09; 是用于存储函数调用&#xff0c;局部变量和函数参数的一种内存区域&#xff0c;它的特性就是先进后出&#xff08;FILO&#xff09;。…

Spring底层入门(七)

1、异常处理 在DispatcherServlet中&#xff0c;doDispatch(HttpServletRequest request, HttpServletResponse response) 方法用于进行任务处理&#xff1a; 在捕获到异常后没有立刻进行处理&#xff0c;而是先用一个局部变量dispatchException进行记录&#xff0c;然后统一由…

AI电视起风,三星电视打破“隔代飞跃”,在AI纪元再次领跑

作者 | 曾响铃 文 | 响铃说 要说什么是当下最热的话题&#xff0c;刚落下帷幕的北京车展一定是其中之一&#xff0c;除了各类让人眼花缭乱的新车&#xff0c;纷至沓来的各界行业大佬&#xff0c;也让车展话题度被不断拉高。在此之外&#xff0c;此次车展还刮起了一股“旋风”…

A100 解析:为何它成为 AI 大模型时代的首选?

前言 NVIDIA A100 Tensor Core GPU 可针对 AI、数据分析和 HPC 应用场景&#xff0c;在不同规模下实现出色的加速&#xff0c;有效助力更高性能的弹性数据中心。A100 采用 NVIDIA Ampere 架构&#xff0c;是 NVIDIA 数据中心平台的引擎。A100 的性能比上一代产品提升高达 20 倍…

QT:QT与操作系统

文章目录 信号槽与事件QT多线程概述原理完成倒计时程序 UDP回显服务器服务端客户端 信号槽与事件 在之前的信号槽中&#xff0c;已经有了一个基本的认识&#xff0c;那么对于QT中事件的理解其实就非常的类似&#xff0c;当用户进行某种操作的时候&#xff0c;就会触发事件&…

CCF-Csp算法能力认证,202206-1归一化处理(C++)含解析

前言 推荐书目&#xff0c;在这里推荐那一本《算法笔记》&#xff08;胡明&#xff09;&#xff0c;需要PDF的话&#xff0c;链接如下 「链接&#xff1a;https://pan.xunlei.com/s/VNvz4BUFYqnx8kJ4BI4v1ywPA1?pwd6vdq# 提取码&#xff1a;6vdq”复制这段内容后打开手机迅雷…