zlib(http://zlib.NET/)提供了简洁高效的In-Memory数据压缩和解压缩系列API函数,很多应用都会用到这个库,其中compress和uncompress函数是最基本也是最常用的。不过很奇怪的是,compress和uncompress函数尽管已经非常的简单,却仍然有不少人用得不好,其实归根结底还是在于有些事情没有弄明白,这里大家先看下面的代码

#include <stdlib.h>  

#include <string.h>  

#include <stdio.h>  

#include <zlib.h>  

  

int main(int argc, char* argv[])  

{  

    char text[] = "zlib compress and uncompress test\nturingo@163.com\n2012-11-05\n";  

    uLong tlen = strlen(text) + 1;  /* 需要把字符串的结束符'\0'也一并处理 */  

    char* buf = NULL;  

    uLong blen;  

  

    /* 计算缓冲区大小,并为其分配内存 */  

    blen = compressBound(tlen); /* 压缩后的长度是不会超过blen的 */  

    if((buf = (char*)malloc(sizeof(char) * blen)) == NULL)  

    {  

        printf("no enough memory!\n");  

        return -1;  

    }  

  

    /* 压缩 */  

    if(compress(buf, &blen, text, tlen) != Z_OK)  

    {  

        printf("compress failed!\n");  

        return -1;  

    }  

  

    /* 解压缩 */  

    if(uncompress(text, &tlen, buf, blen) != Z_OK)  

    {  

        printf("uncompress failed!\n");  

        return -1;  

    }  

  

    /* 打印结果,并释放内存 */  

    printf("%s", text);  

    if(buf != NULL)  

    {  

        free(buf);  

        buf = NULL;  

    }  

  

    return 0;  

}

zlib处理的对象是Bytef*字节流,很多人遇到字符串就会混淆了,其实很简单,字节流是没有结束符的,需要配备长度信息,所以处理字符串的时候需要把结束符也当成一个普通的字节,这样计算长度的时候也需要算它一份。另外绝大部分人都想动态分配缓冲区,也就是说需要多少再给多少,其实zlib本身有提供compressBound函数用于计算压缩后缓冲区长度的上限值,不需要额外再设计一些不适当的预测算法,不过解压缩的时候没有提供长度的预测,由于compress和uncompress一般都是成对使用的,预先保存好原文的长度即可。

【神经网络与深度学习】【C/C++】ZLIB学习的更多相关文章

  1. (转)神经网络和深度学习简史(第一部分):从感知机到BP算法

    深度|神经网络和深度学习简史(第一部分):从感知机到BP算法 2016-01-23 机器之心 来自Andrey Kurenkov 作者:Andrey Kurenkov 机器之心编译出品 参与:chen ...

  2. 【译】神经网络与深度学习 Ch1-Section0

    用神经网络识别手写数字 人类的视觉系统是是大自然的奇迹.考虑下面手写数字序列: 大多数人能够轻易地是识别出是504192.在我们大脑的每个半球都有一个基础的皮质,这就是我们熟知的V1区,它包含了14亿 ...

  3. Neural Networks and Deep Learning(神经网络与深度学习) - 学习笔记

    catalogue . 引言 . 感知器及激活函数 . 代价函数(loss function) . 用梯度下降法来学习-Learning with gradient descent . 用反向传播调整 ...

  4. [DeeplearningAI笔记]神经网络与深度学习人工智能行业大师访谈

    觉得有用的话,欢迎一起讨论相互学习~Follow Me 吴恩达采访Geoffrey Hinton NG:前几十年,你就已经发明了这么多神经网络和深度学习相关的概念,我其实很好奇,在这么多你发明的东西中 ...

  5. Deep Learning.ai学习笔记_第一门课_神经网络和深度学习

    目录 前言 第一周(深度学习引言) 第二周(神经网络的编程基础) 第三周(浅层神经网络) 第四周(深层神经网络) 前言 目标: 掌握神经网络的基本概念, 学习如何建立神经网络(包含一个深度神经网络), ...

  6. 【吴恩达课后测验】Course 1 - 神经网络和深度学习 - 第二周测验【中英】

    [中英][吴恩达课后测验]Course 1 - 神经网络和深度学习 - 第二周测验 第2周测验 - 神经网络基础 神经元节点计算什么? [ ]神经元节点先计算激活函数,再计算线性函数(z = Wx + ...

  7. 【吴恩达课后测验】Course 1 - 神经网络和深度学习 - 第一周测验【中英】

    [吴恩达课后测验]Course 1 - 神经网络和深度学习 - 第一周测验[中英] 第一周测验 - 深度学习简介 和“AI是新电力”相类似的说法是什么? [  ]AI为我们的家庭和办公室的个人设备供电 ...

  8. 对比《动手学深度学习》 PDF代码+《神经网络与深度学习 》PDF

    随着AlphaGo与李世石大战的落幕,人工智能成为话题焦点.AlphaGo背后的工作原理"深度学习"也跳入大众的视野.什么是深度学习,什么是神经网络,为何一段程序在精密的围棋大赛中 ...

  9. 如何理解归一化(Normalization)对于神经网络(深度学习)的帮助?

    如何理解归一化(Normalization)对于神经网络(深度学习)的帮助? 作者:知乎用户链接:https://www.zhihu.com/question/326034346/answer/730 ...

  10. 【神经网络与深度学习】卷积神经网络(CNN)

    [神经网络与深度学习]卷积神经网络(CNN) 标签:[神经网络与深度学习] 实际上前面已经发布过一次,但是这次重新复习了一下,决定再发博一次. 说明:以后的总结,还应该以我的认识进行总结,这样比较符合 ...

随机推荐

  1. 【jqGrid】翻页获取选中的值

    1.实现效果: 点击确定所选按钮之后,获取翻页选中的题库表号 2.关键代码 onSelectAll: function (aRowids, status) { }, onSelectRow: func ...

  2. ipvsadm命令用法

    ipvsadm命令选项 -A                         添加虚拟服务器 -E                         修改虚拟服务器 -D                 ...

  3. Trying to get property 'art_id' of non-object

    “Trying to get property 'art_id' of non-object”     正在尝试获取非对象的“art-id”属性. 我之前也是这么写的没出问题<td>{{$ ...

  4. java中的排列组合

    使用之前需要声明一个Combine的对象,调用startCombile方法,可返回想要的组合数或者个数,参数介绍很重要 public class Combine { private Object[] ...

  5. Mockito 2 参数匹配器

    Mockito 通过使用 equals() 这种自然的 Java 样式来校验参数值.有时候,当需要有其他一些灵活性的时候,你可能会要求使用参数匹配(argument matchers). 请参考下面的 ...

  6. 关于博主&&联系博主

    关于我自己 天朝一名普通理科男高中生,现正读高二. 一位正在求学之路上奋斗的蒟蒻.很爱听歌,欧美为主,霉霉死粉.交际方面比较弱. 常用编辑器为DEV-C++,编译器为gcc,常用OJ是洛谷 基本熟练使 ...

  7. ubuntu1804搜狗输入法乱码问题解决

    打开终端,移除搜狗输入法配置文件: cd ~/.config sudo rm -rf SogouPY* sogou* 然后重启电脑即可.

  8. 使用python 将地址链接变成二维码

    import os from MyQR import myqr myqr.run( words='https://sz.ke.com/?utm_source=baidu&utm_medium= ...

  9. 3.Linux系统文件名字体不同的颜色都代表什么

    在Linux中,文件的颜色都是有含义的.其中, Linux中文件名颜色不同,代表文件类型不一样.如下所示: 白色:表示普通文件浅蓝色:表示链接文件: 灰色:表示其他文件: 绿色:表示可执行文件: 红色 ...

  10. [ML] Gradient Boost

    参考链接: 1. https://medium.com/@cwchang/gradient-boosting-%E7%B0%A1%E4%BB%8B-f3a578ae7205 2. https://zh ...