第三方库介绍——zlib库

news2024/11/25 0:34:14

文章目录

  • zlib
    • 1. zlib库介绍
    • 2. zlib库的应用
    • 3. 下载地址
    • 4. 函数使用教程
      • 4.1 compress 与 uncompress
      • 4.3 使用过程解析
      • 4.2 infate、deflate、z_stream
    • 5. 交叉编译zlib库

zlib

1. zlib库介绍

  • zlib是一套通用的解压缩开源库,提供了内存(in-memory)压缩和解压函数,能检测解压出来的数据完整性,zlib 也支持读写 gzip (.gz) 格式的文件,可以阅读:zlib库介绍三:gzip(.gz格式)文件读写
  • 默认且目前仅使用deflate算法压缩data部分;deflate是一种压缩算法,是huffman编码的一种加强。

2. zlib库的应用

数以万计的应用程序直接或间接依靠zlib压缩函式库,包括:

  • FFmpeg:以zlib读写Matroska等以DEFLATE算法压缩的多媒体串流格式。
  • OpenSSH、OpenSSL:以zlib达到最佳化加密网络传输。
  • Linux核心:使用zlib以实作网络协定的压缩、档案系统的压缩以及开机时解压缩自身的核心。
  • libpng,用于PNG图形格式的一个实现,对bitmap数据规定了DEFLATE作为流压缩方法。
  • 略、、、、

参考博文:zlib库介绍一:zlib简介

3. 下载地址

  • zlib官网下载

  • 所有版本的下载地址

4. 函数使用教程

zlib 在 examples 路径下提供了许多使用zlib的例子:

在这里插入图片描述
在README.examples 有介绍各个example的作用。

4.1 compress 与 uncompress

compress和uncompress是zlib最基本的两个函数了。他们分别用于压缩和解压数据。 原型如下:

int compress(unsigned char* dest,
			 unsigned long*destLen, 
			 const unsigned char* source, 
			 unsigned long sourceLen);

int compress2(unsigned char* dest, 
			 unsigned long*destLen, 
			 const unsigned char* source,
			 unsigned long sourceLen, 
			 int level);

参数:

  • dest:压缩之后的数据缓冲区。
  • desLen:压缩之后的数据缓冲区长度。
  • source:原始数据缓冲区(压缩之前的数据内容)。
  • sourceLen:原始数据长度。
  • level:level:压缩比例,压缩级别取值:0 - 9。0压缩速度最快,9压缩速度最慢,压缩率最大。0表示不进行压缩。【compress2才有】

返回值:

  • Z_OK:成功。
  • Z_MEM_ERROR:没有足够的内存。
  • Z_BUF_ERROR:输出的缓冲区没有足够的空间。
  • Z_STREAM_ERROR:level参数设置不正确。【compress2才有】
int uncompress(unsigned char* dest, 
				unsigned long* destLen,
				unsigned char* source, 
				unsigned long sourceLen);
				
int uncompress2(unsigned char* dest,
				unsigned long* destLen,
				unsigned char* source, 
				unsigned long* sourceLen);

参数:

  • dest:解缩之后的数据缓冲区

  • desLen:解缩之后的数据缓冲区长度

  • source:要解压的数据缓冲区

  • sourceLen:要解压的数据长度

返回值:

  • Z_OK:成功。

  • Z_MEM_ERROR:没有足够的内存。

  • Z_BUF_ERROR:输出的缓冲区没有足够的空间。

  • Z_DATA_ERROR:输入的原始数据(source)被损坏了,或不完整。

uncompress2函数相比于uncompress函数,原始数据长度采用指针进行表示。

4.3 使用过程解析

  1. 压缩、解压过程 方案一

压缩:deflateInit() ->deflate() ->deflateEnd();

解压:inflateInit() -> inflate() -> inflateEnd();

  1. 压缩、解压过程 方案二

压缩:deflateInit2() ->deflate() ->deflateEnd();

解压:inflateInit2() -> inflate() -> inflateEnd();

ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen,
                                 const Bytef *source, uLong sourceLen));
ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen,
                                   const Bytef *source, uLong sourceLen));

参数类型

  • Bytef表示字节流,它与字符串有所不同,字节流没有结束符,因而需要配备长度信息,处理字符串的时候需要把结束符也当成一个普通的字节。
  • uLongf则用于指明长度信息了, 其实相当于unsigned long。
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
 
#include <zlib.h>
 
 
int main(int argc, char *argv[])
{ 
    char inbuf[] = "Hello, This is a demo for compress and uncompress interface!\n"
                 "Written by windeal.li\n"
                 "email: 2378264731@qq.com\n";
    uLong inlen = sizeof(inbuf);
    char *outbuf = NULL;
    uLong outlen;
 
    outlen = compressBound(inlen);
    printf("in_len: %ld\n", inlen);
    printf("out_len: %ld\n", outlen);
 
    if ((outbuf = (char *)malloc(sizeof(char) * outlen)) == NULL){
        fprintf(stderr, "Failed to malloc memory for outbuf!\n");
        return -1;
    }
 
    /* compress */
    if (compress(outbuf, &outlen, inbuf, inlen) != Z_OK) {
        fprintf(stderr, "Compress failed!\n");
        return -1;
    }
    printf("Compress Sucess!\n");
    printf("\routlen:%ld, outbuf:%s\n", outlen, outbuf);
  
    memset(inbuf, 0, sizeof(inbuf));
    /* Uncompress */
    if (uncompress(inbuf, &inlen, outbuf, outlen) != Z_OK){
        fprintf(stderr, "Uncompress failed!\n");
        return -1;
    }
    printf("Uncompress Success!\n");
    printf("\rinlen:%ld, inbuf:%s\n", inlen, inbuf);
 
    /* free memory */
    if (outbuf != NULL){
        free(outbuf);
        outbuf = NULL;
    }
 
    return 0;
}

4.2 infate、deflate、z_stream

这里infate 和defate 其实是指两组函数

  • deflateInit() + deflate() + deflateEnd()用于完成流的压缩
  • inflateInit() + inflate() + inflateEnd()用于完成解压缩功能
int deflateInit (z_streamp strm, int level);  //初始化压缩状态,关联相关的z_stream数据结构和压缩比例
int deflate (z_streamp strm, int flush);   //压缩数据,  flush表示以何种方式将压缩的数据写到缓冲区中。
int deflateEnd (z_streamp strm);    //压缩结束

int inflateInit (z_streamp strm);        
int inflate (z_streamp strm, int flush);
int inflateEnd (z_streamp strm); 

z_stream是上面两组函数中用到的,用来表示流的数据结构。

typedef struct z_stream_s {
    z_const Bytef *next_in;   // 将要压缩数据的首地址
    uInt     avail_in;  // 将要压缩数据的长度
    uLong    total_in;  // 将要压缩数据缓冲区的长度
 
    Bytef    *next_out;  // 压缩后数据保存位置。
    uInt     avail_out; // 压缩后数据的长度
    uLong    total_out; // 压缩后数据缓冲区的大小
 
    z_const char *msg; // 存放最近的错误信息,NULL表示没有错误
    struct internal_state FAR *state; /* not visible by applications */
 
    alloc_func zalloc;  /* used to allocate the internal state */
    free_func  zfree;   /* used to free the internal state */
    voidpf     opaque;  /* private data object passed to zalloc and zfree */
 
    int     data_type;   // 表示数据类型,文本或者二进制
    uLong   adler;      /* adler32 value of the uncompressed data */
    uLong   reserved;   /* reserved for future use */
} z_stream;    

关于这两组函数的具体使用, zlib-1.2.11/examples/zpipe.c或zlib-1.2.11/test/example.c,可以直接参考。

参考博文:

zlib库 安装与使用

zlib库使用简单讲解

5. 交叉编译zlib库

linux主机:ubuntu-18.04

交叉编译器:arm-buildroot-linux-gnueabihf

开发板kernel:Linux 5.4.0-150-generic x86_64

开发板:100ASK_STM32MP157_PRO开发板

zlib版本:zlib-1.2.11.tar.gz


下载

zlib-1.2.11.tar.gz

解压

tar xvf zlib-1.2.11.tar.gz

引入交叉编译器

export CC=/home/book/100ask_stm32mp157_pro-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin/arm-buildroot-linux-gnueabihf-gcc

配置configure,指定安装后的文件在install文件夹里面

./configure --prefix=$PWD/install

在这里插入图片描述

编译

make

在这里插入图片描述

安装

sudo make install

在这里插入图片描述
由于前面运行configure文件的时候指定了安装的路径

cd install/lib

lib库里面包含静态库和动态库,注意软连接

book@100ask:~/Desktop/zlib/zlib-1.2.11/install/lib$ ls -lath
total 248K
drwxrwxr-x 5 book book 4.0K Jun 18 21:46 ..
drwxrwxr-x 2 book book 4.0K Jun 18 21:46 pkgconfig
drwxrwxr-x 3 book book 4.0K Jun 18 21:46 .
lrwxrwxrwx 1 book book   14 Jun 18 21:46 libz.so -> libz.so.1.2.11
lrwxrwxrwx 1 book book   14 Jun 18 21:46 libz.so.1 -> libz.so.1.2.11
-rwxr-xr-x 1 book book 120K Jun 18 21:46 libz.so.1.2.11
-rw-r--r-- 1 book book 113K Jun 18 21:46 libz.a

检查编译结果

file libz.so.1.2.11 

在这里插入图片描述

使用zlib的接口,只需在 链接命令后加-lz /usr/llocal/lib/libz.a 即可。

gcc -o zpipe.o -c zpipe.c
gcc -o zpipe zpipe.o -lz /usr/local/lib/libz.a 

参考博文:zlib开发笔记(三):zlib库介绍、在ubuntu上进行arm平台交叉编译

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

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

相关文章

SpringBoot对接kafka,批量、并发、异步获取消息,并动态、批量插入库表

SpringBoot对接kafka,批量、并发、异步获取消息,并动态、批量插入库表 更多优秀文章&#xff0c;请扫码关注个人微信公众号或搜索“程序猿小杨”添加。 一、背景 因业务发展需要&#xff0c;需要对接kafka&#xff0c;快速批量接收消息日志&#xff0c;避免消息日志累积过多&a…

客服岗位必备的在线工具:内部知识库

随着互联网的快速发展&#xff0c;越来越多的企业开始将客户服务转移到在线平台上&#xff0c;以便更好地满足客户需求。在线客服是这一趋势中的重要组成部分&#xff0c;它不仅能够提高客户满意度&#xff0c;还能够提高客户忠诚度和品牌形象。但是在进行在线客服工作时&#…

Vault从入门到精通系列之一:深入了解安全工具Vault、Vault根令牌和解封密钥,详细整理部署Vault的详细步骤

Vault从入门到精通系列之一&#xff1a;深入了解安全工具Vault、Vault根令牌和解封密钥&#xff0c;详细整理部署Vault的详细步骤 一、深入了解安全工具Vault二、Vault根令牌和解封密钥的含义和作用三、centos7上部署和启动Vault的流程四、vault下载地址五、安装vault六、启动V…

爬虫程序采集网络数据

目录 一、Xampp搭建本地网站 二、认识Html标签 三、爬虫程序范例 &#xff08;一&#xff09;调用模块 &#xff08;二&#xff09;加载需要爬虫的网址 &#xff08;三&#xff09;爬取内容选取 &#xff08;四&#xff09;爬取内容保存 &#xff08;五&#xff09; 完整爬…

【MySQL】不就是多表查询

前言 嗨&#xff01;小伙伴们大家好呀&#xff0c;忙碌的一周就要开始&#xff01;在此之前我们学习的MySQL数据库的各种操作都是在一张表之中&#xff0c;今天我们学习要对多张表进行相关操作&#xff0c;相比较于单一的表来说&#xff0c;多张表操作相对复杂一些&#xff0c;…

GaussDB云数据库SQL应用系列—分区表管理

目录 前言 一、分区表基本原理 二、分区表主要优势 三、分区表常见场景 四、GaussDB分区表管理&#xff08;示例&#xff09; 示例一&#xff1a;创建范围分区表(RANGE) 示例二&#xff1a;创建哈希分区表&#xff08;HASH&#xff09; 示例三&#xff1a;创建列表分区…

Python基础(8)——转换数据类型

Python基础&#xff08;8&#xff09;——转换数据类型 文章目录 Python基础&#xff08;8&#xff09;——转换数据类型目标一. 转换数据类型的作用二. 转换数据类型的函数三. 快速体验四. 实验总结 目标 数据类型转换的必要性数据类型转换常用方法 一. 转换数据类型的作用 …

【数据库原理与实践】DS系的期末考题(2023)

前排感谢 感谢在数据库期末考试中进行截图保存题目的大数据同学,给隔壁计算机同学一些小安慰呜呜 选择题 由于顺序其实无关紧要,这里遂不再按题号进行整理 答案仅是本人初步作答,可能存在错误,欢迎指出 8:B 数据的定义:数据库中存储的基本对象 9:ABC 数据库系统DBS组…

神经网络中的损失函数

在《神经网络中常见的激活函数》一文中对激活函数进行了回顾&#xff0c;下图是激活函数的一个子集—— 而在神经网络领域中的另一类重要的函数就是损失函数&#xff0c;那么&#xff0c;什么是损失函数呢&#xff1f; 损失函数是将随机事件或其有关随机变量的取值映射为非负实…

网络安全学术顶会——CCS '22 议题清单、摘要与总结(上)

注意&#xff1a;本文由GPT4与Claude联合生成。 按语&#xff1a;ChatGPT在计算机领域的翻译质量还是欠缺一些&#xff0c;翻译出来的中文有的不够自然&#xff0c;经常完全按照英文的表达方式来&#xff0c;导致中文特别长&#xff0c;很绕。GPT4的翻译效果相对ChatGPT效果要好…

第38步 深度学习图像识别:VGG19建模(Tensorflow)

基于WIN10的64位系统演示 一、写在前面 &#xff08;1&#xff09;预训练模型和迁移学习 预训练模型就像是一个精心制作的省力工具&#xff0c;它是在大量的数据上进行训练&#xff0c;然后将学习到的模型参数保存下来。然后&#xff0c;我们可以直接使用这些参数&#xff0…

gitlab_ci.yml展示单元测试报告 (FREE)

CI/CD 流水线通常包含验证您的代码的测试作业。 如果测试失败&#xff0c;流水线将失败并通知用户。处理合并请求的人必须检查作业日志并查看测试失败的地方&#xff0c;以便可以修复它们。 您可以将作业配置为使用单元测试报告&#xff0c;极狐GitLab 会显示有关合并请求的报…

一种实现Spring动态数据源切换的方法 | 京东云技术团队

1 目标 不在现有查询代码逻辑上做任何改动&#xff0c;实现dao维度的数据源切换&#xff08;即表维度&#xff09; 2 使用场景 节约bdp的集群资源。接入新的宽表时&#xff0c;通常uat验证后就会停止集群释放资源&#xff0c;在对应的查询服务器uat环境时需要查询的是生产库…

SegNeXt:重新思考语义分割中卷积注意力设计

论文链接&#xff1a;https://arxiv.org/abs/2209.08575 github&#xff1a; https://github.com/Visual-Attention-Network/SegNeXt 参考视频&#xff1a;【翻译成中文带你读】SegNext论文逐行精读&#xff0c;30分钟就能快速了解其奥秘&#xff01;-人工智能/深度学习/计算…

Triton教程---存储代理

Triton教程—存储代理 存储库代理使用在加载或卸载模型时运行的新功能扩展了 Triton。 您可以在加载模型时引入自己的代码来执行身份验证、解密、转换或类似操作。 测试版&#xff1a;存储库代理 API 是测试版质量&#xff0c;并且会针对一个或多个版本进行非向后兼容的更改。…

牛客网 2023 最新 “Java 面试八股文+各大厂的面试真题“出炉,面面俱到,太全了

一转眼 2023 年已经过了大半了&#xff0c;不知道你金三银四上岸了&#xff0c;还是等着秋招呢&#xff1f;大家从 Boss 直聘上或者其他招聘网站上都可以看到 Java 岗位众多&#xff0c;Java 岗位的招聘薪酬天差地别&#xff0c;人才要求也是五花八门。而很多 Java 工程师求职过…

css3 grid 布局

特别声明&#xff1a;这篇博客转载于阮一峰老师&#xff0c;转载是为了方便日后复习&#xff0c;实在写的太棒了。 目录 一、概述 二、基本概念 2.1 容器和项目 2.2 行和列 2.3 单元格 2.4 网格线 三、容器属性 3.1 display 属性 3.2grid-template-columns 属性&#x…

[Studio3T]无限试用

新建文本文件 echo off ECHO 重置Studio 3T的使用日期...... REG DELETE "HKEY_CURRENT_USER\Software\JavaSoft\Prefs\3t\mongochef\enterprise" /f RMDIR /s /q %USERPROFILE%\.3T\studio-3t\soduz3vqhnnja46uvu3szq-- RMDIR /s /q %USERPROFILE%\.3T\studio-3t\L…

数字电路基础---触发器

数字电路基础---触发器 触发器&#xff08;Flip-Flop&#xff09;也是数字电路中的一种具有记忆功能的逻辑元件。触发器对脉冲边沿敏感的存储单元电路&#xff0c;它只在触发脉冲的上升沿&#xff08;或下降沿&#xff09;瞬间改变其状态。在数字电路中可以记录二进制数字信号“…

crfclust.bdb过大

有套11204集群环境&#xff0c;现场反馈/u01使用率100%&#xff0c;数据库无法使用了&#xff0c;本以为是aud文件太多导致的&#xff0c;查看后发现是crfclust.bdb多大了&#xff0c;有100多G了 [roothydb1 hydb1]#du -sh crfclust.bdb 101G crfclust.bdb [roothydb1 hydb…