• 【神经网络与深度学习】【C/C++】ZLIB学习


    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 turingo@163.com 2012-11-05 ";  
        uLong tlen = strlen(text) + 1;  /* 需要把字符串的结束符''也一并处理 */  
        char* buf = NULL;  
        uLong blen;  
      
        /* 计算缓冲区大小,并为其分配内存 */  
        blen = compressBound(tlen); /* 压缩后的长度是不会超过blen的 */  
        if((buf = (char*)malloc(sizeof(char) * blen)) == NULL)  
        {  
            printf("no enough memory! ");  
            return -1;  
        }  
      
        /* 压缩 */  
        if(compress(buf, &blen, text, tlen) != Z_OK)  
        {  
            printf("compress failed! ");  
            return -1;  
        }  
      
        /* 解压缩 */  
        if(uncompress(text, &tlen, buf, blen) != Z_OK)  
        {  
            printf("uncompress failed! ");  
            return -1;  
        }  
      
        /* 打印结果,并释放内存 */  
        printf("%s", text);  
        if(buf != NULL)  
        {  
            free(buf);  
            buf = NULL;  
        }  
      
        return 0;  
    }  


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

  • 相关阅读:
    s=a+aa+aaa+aaaa+aa...aaaa
    ibatis入门
    ibatis多参数的问题
    异步分页ajax
    8M的摄像头,30fps摄像时,60hz的LCD刷新频率,请问camera每秒向BB传输多少数据,如何计算
    android tcp通讯
    為什麼我的手機連Wi-Fi速度總是卡在75Mbps?Wi-Fi速度解惑~帶你一次看懂!
    mbps和MB/s是怎么换算的
    简说各种wifi无线协议的传输速率
    mil,mm与inch之间的转换
  • 原文地址:https://www.cnblogs.com/huty/p/8517898.html
Copyright © 2020-2023  润新知