第三方库介绍——zlib库

这篇具有很好参考价值的文章主要介绍了第三方库介绍——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的例子:

第三方库介绍——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

引入交叉编译器【zlib的configure不支持设置–host项】

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

除了上面的引入交叉编译器,也可以手动更改Makefile,vim命令打开Makefile文件,将其中的CC、AR、RANLIB等都修改为arm-linux交叉编译器的相关参数

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

./configure --prefix=$PWD/install

第三方库介绍——zlib库

编译

make

第三方库介绍——zlib库

安装

sudo make install

第三方库介绍——zlib库
由于前面运行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库

使用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平台交叉编译文章来源地址https://www.toymoban.com/news/detail-490358.html

到了这里,关于第三方库介绍——zlib库的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 第三方库介绍——libpng

    libpng是一款C语言编写的比较底层的读写PNG文件的跨平台的库。由于依赖于zlib库,所以在安装libpng时往往还需要安装zlib库。 zlib库和libpng库的下载地址:https://jaist.dl.sourceforge.net/project/libpng/ libpng库下载的版本为:libpng-1.6.37 zlib库下载的版本为:zlib-1.2.11 由于某些系统可能自带

    2024年02月11日
    浏览(45)
  • 如何去阅读开源的第三方库的源码

    2023年9月2日,周六晚上 今天探索了一天如何去阅读第三方库的源码,终有所获。 再结合以前看cereal项目的源码的经验,于是就有了这篇博客。 我个人认为: 在阅读一个开源的第三方库之前,要先学会这个第三方库的一些简单用法,然后再顺着这个学会的用法去看相关的源码

    2024年02月09日
    浏览(48)
  • 云备份——第三方库简单介绍并使用(上)

    目录 一,Jsoncpp库序列化和反序列化 二,bundle文件压缩库  2.1 文件压缩 2.2 文件解压 首先我们需要先了解一下json是什么,json是一种数据交换格式,采用完全独立于编程语言的文本格式来存储和表示数据。 json 数据类型:对象,数组,字符串,数字 对象:使用花括号 {} 括起

    2024年02月10日
    浏览(49)
  • python-切换镜像源和使用PyCharm进行第三方开源包安装

      如果您觉得有用的话,记得给 博主点个赞,评论,收藏一键三连啊 ,写作不易啊^ _ ^。   而且听说 点赞的人每天的运气都不会太差 ,实在白嫖的话,那欢迎常来啊!!! 1. 切换镜像源 切换镜像源,多的不说,敏感字就不写了,会被拦截 点击下面红框处: 把里面的内容替

    2024年02月07日
    浏览(48)
  • OAuth 2.0 协议介绍【实现 GitHub 第三方登录】

    OAuth(是 Open Authorization 开放授权的缩写),在全世界得到广泛应用,目前的版本是2.0版。 本文会对OAuth 2.0的设计思路和运行流程,做一个简明通俗的解释,主要参考材料为RFC 6749。 OAuth 2.0 是一个开放标准,用于授权用户访问另一个应用程序的资源,而无需将用户的凭据(比如

    2024年02月20日
    浏览(67)
  • 群星璀璨的Python江湖,Python第三方库介绍

    如果Python语言是一个江湖,那么python第三方库就是一个个身怀绝技的江湖侠客,这些侠客在这偌大的江湖尽情挥洒着江湖侠气。有人名扬天下,有人默默无闻,有人纵横捭阖,有人黯然谢幕,每天都在上演人生的悲欢离合。 那么什么是python第三方库呢? python是一门非常流行

    2024年03月10日
    浏览(51)
  • 前端使用firebase配置第三方登录介绍(谷歌登录,facebook登录等)

    点此处去 firebase 官网 点此处去 web端的谷歌登录文档 点此处去 facebook开发者官网链接 首先注册一个账号登录firebase(可以使用谷歌账号登录) 然后创建项目(走默认配置就行了) 添加应用(走默认配置),如图所示,本文介绍web应用。 应用添加完毕后走项目设置-如下图(

    2024年04月13日
    浏览(48)
  • redis(其它操作、管道)、django中使用redis(通用方案、 第三方模块)、django缓存、celery介绍(celery的快速使用)

    1 redis其它操作 2 redis管道 3 django中使用redis 3.1 通用方案 3.2 第三方模块 4 django缓存 5 celery介绍 5.1 celery的快速使用

    2024年02月07日
    浏览(50)
  • Python第三方库安装教程、什么是第三方库

    Python有一个全球社区:https://pypi.org/,在这里我们可以搜索任何主题的Python第三方库。PyPI全称是Python Package Index,指的是Python包的索引,它由PSF(Python Software Foundation)来维护,并且展示全球Python计算生态。 我们需要学会利用PyPI的主站检索,找到我们使用和关心的Python第三方

    2024年02月03日
    浏览(108)
  • 引入第三方字体库 第三方字体库Google Fonts

    googlefonts官方网站 googlefonts中国网站 本人是在微信小程序中引入 在static中建一个文件夹font-family 例如字体链接:https://fonts.font.im/css?family=Kirang+Haerang 将该链接的返回的资源的复制到css文件中 font-family.css main.js引入 微信小程序不校验合法域名就能看到结果

    2024年02月16日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包