c语言使用zlib实现文本字符的gzip压缩与gzip解压缩

网络上找到的好多方法在解压缩字符串的时候会丢失字符,这里是解决方法:

http://stackoverflow.com/questions/21186535/compressing-decompressing-char-array-using-zlib-some-characters-missing

基于此,笔者修改了一下,由于是初学者,只按照编译器不报错的原则修改了一下,能运行

打开vc++6.0新建控制台程序程序,配置好zdll.lib,把zlib1.dll放置到合适的位置主程序main.cpp如下#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "zlib.h"

int main()
{
  const char *istream = "some foo汉字";
  uLong srcLen = strlen(istream)+1;      // +1 for the trailing `\0`
  uLong destLen = compressBound(srcLen); // this is how you should estimate size
                                         // needed for the buffer
  unsigned char* ostream = (unsigned char*)malloc(destLen);
  int res = compress(ostream, &destLen, (const unsigned char *)istream, srcLen);
  // destLen is now the size of actuall buffer needed for compression
  // you don‘t want to uncompress whole buffer later, just the used part
  if(res == Z_BUF_ERROR){
    printf("Buffer was too small!\n");
    return 1;
  }
  if(res ==  Z_MEM_ERROR){
    printf("Not enough memory for compression!\n");
    return 2;
  }

  unsigned char *i2stream = ostream;
  char* o2stream = (char *)malloc(srcLen);
  uLong destLen2 = destLen; //destLen is the actual size of the compressed buffer
  int des = uncompress((unsigned char *)o2stream, &srcLen, i2stream, destLen2);
  printf("%s\n", o2stream);
  return 0;
}

附件下载

时间: 2024-10-11 16:30:40

c语言使用zlib实现文本字符的gzip压缩与gzip解压缩的相关文章

Swift语言指南(十)--字符串与字符

原文:Swift语言指南(十)--字符串与字符 字符串是一段字符的有序集合,如"hellow,world"或"信天翁".Swift 中的字符串由 String 类型表示,对应着 Character 类型值的集合. Swift 中的 String 类型为你的编程提供了一个高速的,兼容 Unicode规范 的文本处理方式.Swift 创建和处理字符串的语法轻量可读,与 C 语言的字符串语法颇为相似.字符串的拼接非常简单,只需将两个字符串用 + 运算符相加.字符串的值是否

api (三)文本字符输出 (转)

在使用Win32编程时,我们常常要输出文本到窗口上,Windows所有的文本字符或者图形输出都是通过图形设备接口(GDI)进行的,Windows的三大核心组件之一的GDI32.dll封装了所有的文本和图像输出. GDI基本知识 Windows下要绘图和输出文本,都是通过GDI(Graphics Device Interface,图形设备接口)完成的,GDI是windows在绘制图文时的设备上下文环境,包括画笔.画刷.字体.位图等多种与绘制有关的对象.设备环境(DC)在绘制中起至关重要的作用.几乎

ASP.net MVC4 View设置Html代码显示为文本字符问题

问题描述: 在ASP.net MVC4 框架下,在后台ViewBag上设置连接属性 ViewBag.link = "<a href='/'>"+DisplayName+"</a>"; 前台输出时使用 <span>@ViewBag.link</span> 页面上显示的内容变成了 <a href='/'>"+DisplayName+"</a> 没有做成链接. 修改方法: 前台输出

C语言中以十六进制输出字符型变量会出现&#39;ffffff&quot;的问题

最近在做一个C的嵌入式项目,发现在C语言中用printf()函数打印字符型变量时,如果想采用"%x"的格式将字符型变量值以十六进制形式打印出来,会出现一个小问题,如下: C代码   char buf[10] = {0}; buf[0] = 0xbf; printf("%2x\n\n\n", buf[0]);            /*在终端将会显示成:ffffffbf*/ buf[1] = 0x7f; printf("%2x\n\n\n", bu

【Windows编程】系列第三篇:文本字符输出

上一篇我们展示了如何使用Windows SDK创建基本控件,本篇来讨论如何输出文本字符. 在使用Win32编程时,我们常常要输出文本到窗口上,Windows所有的文本字符或者图形输出都是通过图形设备接口(GDI)进行的,Windows的三大核心组件之一的GDI32.dll封装了所有的文本和图像输出. GDI基本知识 Windows下要绘图和输出文本,都是通过GDI(Graphics Device Interface,图形设备接口)完成的,GDI是windows在绘制图文时的设备上下文环境,包括画

24_Shell语言————if条件判断之字符测试

前文中介绍过,bash的条件测试主要有以下3类: 整数测试:比较两个整数谁大谁小,是否相等: 字符测试:比较两个字符串是否相等: 文件测试:测试某个文件是否具有读权限.写权限.执行权限等: 整数测试在前文中介绍过,这里着重讲解字符测试.字符测试采用的比较符号是常用的数学符号: >:大于(在ASCII码表中的先后顺序,从左至右逐字比较) <:小于 ==:等于(注意,= 表示赋值) =~:判断左边的字符串是否能够被右边的模式所匹配,通常用于双中括号中: [[ $opt1=~$opt2 ]] 通常做

操作系统和程序设计语言的API使用的字符编码分析

 1.Java的运行环境中,String是什么编码? 使用java做程序设计语言,字符编码是和jvm相关的,和操作系统无关. java默认的编码是jvm在安装的时候就确定了的,它是根据你的系统的环境确定并默认的. 我们可以通过java的Charset类的defaultCharset()方法来获取它默认的字符编码. 我安装的JDK是1.7,系统环境是64位,获取的默认的字符编码是utf16的,并且是Big-Endian(这点我比较奇怪,我的机器是Little-endian的,而虚拟机竟然默认是大端

C语言基础学习2:字符数组

在C语言的基本数据类型中没有没有字符串变量,一般以字符数组的形式给出. 1.字符串数组的初始化 char c[] = {'I', ' ', 'a', 'm', 'h', 'a', 'p', 'p', 'y'}; char c[] = "I am happy"; 区别:第一种方式字符串长度为10,内存中占10*sizeof(char)个字节,第二种方式是以字符串形式表示,有一个字符串结束字符'\0',内存中占11*sizeof(char)个字节. 2.字符数组的输入输出 %c,一个一个字

C语言的 (强制类型转换) 以及 &#39;字符字面值&#39;

C语言的显式/隐式类型转换,都有一个中间变量的存在,原数据的类型.内容都不变. 以下代码,都用GCC编译. 1 #include<stdio.h> 2 3 int main() 4 { 5 printf("%d %d\n", 'a', sizeof((int)'a')); //输出为97,4. sizeof的作用对象为一个int型中间变量 6 7 char c = 255; 8 printf("%d\n", c); //输出-1. char型的c已溢出,