压缩和归档库-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介绍

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

进一步分析并彻底解决 Flink container exit 143 问题

你好&#xff0c;我是 shengjk1&#xff0c;多年大厂经验&#xff0c;努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注&#xff01;你会有如下收益&#xff1a; 了解大厂经验拥有和大厂相匹配的技术等 希望看什么&#xff0c;评论或者私信告诉我&#xff01; 文章目录 一…

腾讯游戏海外扩张,增持芬兰游戏开发商股份持股比例增至14.8%

易采游戏网5月8日消息&#xff0c;近日腾讯再次出手&#xff0c;大幅增持了芬兰知名游戏开发商Remedy Entertainment的股份&#xff0c;持股比例猛增至14.8%。这一举动引起了业界和投资者的广泛关注。 据了解&#xff0c;腾讯此次增持是在2024年4月24日完成的。根据芬兰法律规…

Linux网络-PXE高效批量网络装机(命令+截图详细版)

目录 一.部署PXE远程安装服务 1.PXE概述 1.1.PXE批量部署的优点 1.2.要搭建PXE网络体系的前提条件 2.搭建PXE远程安装服务器 2.1.修改相关网络配置&#xff08;仅主机模式&#xff09; 2.2.关闭防火墙&#xff08;老规矩&#xff09; 2.3.保证挂载上 2.4.准备好配置文…

<网络安全>《76 概念讲解<第十课 物联网常用协议-网络层协议>》

协议简称全称名称内容说明IPv4互联网通信协议第四版IPv4是互联网的核心IPv6互联网协议第6版TCPTransmission Control Protocol传输控制协议TCP旨在适应支持多网络应用的分层协议层次结构。连接到不同但互连的计算机通信网络的主计算机中的成对进程之间依靠TCP提供可靠的通信服务…

【Python】什么是皮尔森系数

我不完美的梦 你陪着我想 不完美的勇气 你说更勇敢 不完美的泪 你笑着擦干 不完美的歌 你都会唱 我不完美心事 你全放在心上 这不完美的我 你总当做宝贝 你给我的爱也许不完美 但却最美 &#x1f3b5; 周冬雨《不完美女孩》 皮尔森相关系数&#xff08;Pe…

FinalShell连接虚拟机Linux系统连接超时

报错信息 java.net.ConnectException: Connection timed out: connect 排除是网络问题后可以尝试一下这个方法。 解决方案: 打开虚拟机终端输入:ifconfig 会出现端口信息: 看ens33这里的端口是多少&#xff0c;改一下重新连接就ok。

springboot+vue实现登录注册,短信注册以及微信扫描登录

说明&#xff1a;微信扫描登录需要微信注册--要钱&#xff0c;感谢尚硅谷提供的免费接口&#xff1b;短信注册需要阿里云的注册很麻烦并且短信费&#xff0c;没有接口&#xff0c;所以不打算实现&#xff0c;不过能做出效果。 目录 一、建立数据库 二、后端idea实现接口 1.…

幻兽帕鲁专用服务器怎样买省钱便宜?一个月30元

在数字娱乐的浪潮中&#xff0c;幻兽帕鲁Palworld以其独特的魅力吸引了无数玩家的目光。想要拥有流畅、稳定的游戏体验&#xff0c;一台专属的游戏服务器是必不可少的。而如何以最经济的价格购买到高品质的服务器&#xff0c;正是玩家们最关心的问题。腾讯云服务器性价比是很高…

每日Attention学习6——Context Aggregation Module

模块出处 [link] [code] [IJCAI 22] Boundary-Guided Camouflaged Object Detection 模块名称 Context Aggregation Module (CAM) 模块作用 增大感受野&#xff0c;全局特征提取 模块结构 模块代码 import torch import torch.nn as nn import torch.nn.functional as Fcla…

Anaconda安装和深度学习环境的安装(TensorFlow、Pytorch)

换了新电脑&#xff0c;重新装一下anaconda这些编程环境。好久没装过了&#xff0c;自己也需要查查资料&#xff0c;然后记录一下&#xff0c;分享给别人。 目标&#xff0c;三个环境&#xff1a;1.anaconda基础环境&#xff08;包含xgboost和lightgbm&#xff09;&#xff0c…

卫星通信现状与展望三 -- 分类总结及6G应用

作者:私语茶馆 卫星通信分类总结及6G应用 一、卫星轨道类型 卫星按照轨道距离地面的距离主要分为以下几种: 卫星轨道类型 卫星用途 轨道高度 VLEO(Very Low Earth Orbit) 对地观测、通信

Python中使用tkinter模块和类结构的结合使用举例——编写制作一个简单的加数GUI界面

Python中使用tkinter模块和类结构的结合使用举例——编写制作一个简单的加数GUI界面 这里写目录标题 Python中使用tkinter模块和类结构的结合使用举例——编写制作一个简单的加数GUI界面一、tkinter模块和类的简述1.1 tkinter的简要介绍1.2 类结构的简要介绍 二、基于类机构和t…

成本降低 90%,出海社交平台 Typing 基于 Databend 的大数据探

Typing&#xff08;输入中科技&#xff09;成立于 2022 年&#xff0c;是一家主要面向东南亚、拉美、中东等海外地区提供社交平台的出海企业。其社交平台类似于国内的 Soul、陌陌等&#xff0c;提供视频直播、语音聊天室、短视频、生活分享、文字聊天等社交功能&#xff0c;注册…

【C++】零钱兑换的始端---柠檬水找零

欢迎来CILMY23的博客 本篇主题为 零钱兑换的始端---柠檬水找零 个人主页&#xff1a;CILMY23-CSDN博客 个人专栏系列&#xff1a; Python | C | C语言 | 数据结构与算法 感谢观看&#xff0c;支持的可以给个一键三连&#xff0c;点赞关注收藏。 前言&#xff1a; 柠檬水找…

2024年最新【SpringBoot2】开发实用篇-测试_springboot2 test(1),2024年最新2024春招BAT面试真题详解

既有适合小白学习的零基础资料&#xff0c;也有适合3年以上经验的小伙伴深入学习提升的进阶课程&#xff0c;涵盖了95%以上软件测试知识点&#xff0c;真正体系化&#xff01; 由于文件比较多&#xff0c;这里只是将部分目录截图出来&#xff0c;全套包含大厂面经、学习笔记、…

吸血鬼崛起v rising皮革获取教程 v rising皮革机怎么获得

《V Rising》是一款由Stunlock Studios公司制作并发行的生存建造类游戏&#xff0c;以“吸血鬼”为题材。中文名为“吸血鬼崛起”。在游戏中&#xff0c;打boss可以获得许多掉落材料&#xff0c;有些材料需要合成&#xff0c;而制作皮革则需要使用皮革机。下面就为大家介绍一下…

利用大语言模型(KIMI)生成OPC UA 信息模型

在大语言模型没有出现之前&#xff0c;人们更倾向使用图形化工具或者基于窗口的软件来构建信息模型&#xff0c;图形化工具能够直观地表达信息模型中各元素之间的相互关系。但是图形化工具也有缺点&#xff0c;当描述一个复杂的信息模型时&#xff0c;图形会变得非常复杂和庞大…

如何通过OMS加快大表迁移至OceanBase

OMS&#xff0c;是OceanBase官方推出的数据迁移工具&#xff0c;能够满足众多数据迁移场景的需求&#xff0c;现已成为众多用户进行数据迁移同步的重要工具。OMS不仅支持多种数据源&#xff0c;还具备全量迁移、增量同步、数据校验等功能&#xff0c;并能够对分表进行聚合操作&…

豪投巨资,澳大利亚在追逐海市蜃楼吗?

澳大利亚政府正在积极投资于量子计算领域。继2021年向量子技术投资逾1亿澳元后&#xff0c;2023年5月&#xff0c;该国发布了首个国家量子战略&#xff0c;详细阐述了如何把握量子技术的未来及保持全球领先地位。 澳大利亚的国家量子战略概述 原文链接&#xff1a; https://ww…

jQuery-1.语法、选择器、节点操作

jQuery jQueryJavaScriptQuery&#xff0c;是一个JavaScript函数库&#xff0c;为编写JavaScript提供了更高效便捷的接口。 jQuery安装 去官网下载jQuery&#xff0c;1.x版本练习就够用 jQuery引用 <script src"lib/jquery-1.11.2.min.js"></script>…