相关原理

deflate(RFC1951):一种压缩算法,使用LZ77和哈弗曼进行编码;

zlib(RFC1950):一种格式,是对deflate进行了简单的封装,他也是一个实现库(delphi中有zlib,zlibex)

gzip(RFC1952):一种格式,也是对deflate进行的封装。

gzip = gzip头 + deflate编码的实际内容 + gzip尾

zlib = zlib头 + deflate编码的实际内容 + zlib尾

deflate 压缩会在前缀加上78 9C 或者78 XX 的标志位。后尾也是4个校验标志。

  1. 尾部分

    CRC32:4字节。原始(未压缩)数据的32位校验和。

    ISIZE:4字节。原始(未压缩)数据的长度的低32位。

    GZIP中字节排列顺序是LSB方式,即Little-Endian,与ZLIB中的相反。

https://blog.csdn.net/rainharder/article/details/26342919

用于c#的开源代码

ZLIB.NET Free v.1.04 Free

http://www.componentace.com/download/download.php?editionid=25

这里面有示例,压缩和解压一个文件。

其中根据压缩等级不同,其前缀标志位不同。可以编辑看看。

原始在这https://www.zlib.net/

来自这里https://blog.csdn.net/jiangxinyu/article/details/3732474

 public override byte[] Compress( byte[] inputBytes,int level   )
{
using ( MemoryStream ms = new MemoryStream() ) {
using ( ZOutputStream zOut = new ZOutputStream( ms, level ) ) {
zOut.Write( inputBytes, 0, inputBytes.Length );
zOut.finish();
return ms.ToArray();
}
}
} public override byte[] Decompress( byte[] inputBytes )
{
using ( MemoryStream ms = new MemoryStream() ) {
using ( ZOutputStream zOut = new ZOutputStream( ms ) ) {
zOut.Write( inputBytes, 0, inputBytes.Length );
zOut.finish();
return ms.ToArray();
}
}
}
/// <summary>
/// 压缩数据集
/// </summary>
/// <param name="ds"></param>
/// <returns></returns>
public static byte[] CompressDS(DataSet ds)
{
MemoryStream ms = new MemoryStream();
ZipOutputStream zos = new ZipOutputStream(ms);
zos.PutNextEntry(new ZipEntry(ds.DataSetName));
BinaryFormatter bf = new BinaryFormatter();
DataSetSurrogate dss = new DataSetSurrogate(ds);
bf.Serialize(zos, dss);
zos.CloseEntry();
zos.Close();
byte[] ret = ms.ToArray();
ms.Close();
return ret;
} /// <summary>
/// 解压数据集
/// </summary>
/// <param name="byt"></param>
/// <returns></returns>
public static DataSet DecompressDS(byte[] byt)
{
MemoryStream ms = new MemoryStream(byt);
BinaryFormatter bf = new BinaryFormatter();
ZipInputStream zis = new ZipInputStream(ms);
zis.GetNextEntry();
DataSetSurrogate dss = (DataSetSurrogate)bf.Deserialize(zis);
zis.Close();
ms.Close();
DataSet ds = dss.ConvertToDataSet();
return ds;
} zlib.net.dll中自带的例子 private void compressFile(string inFile, string outFile)
{
System.IO.FileStream outFileStream = new System.IO.FileStream(outFile, System.IO.FileMode.Create);
zlib.ZOutputStream outZStream = new zlib.ZOutputStream(outFileStream, zlib.zlibConst.Z_DEFAULT_COMPRESSION);
System.IO.FileStream inFileStream = new System.IO.FileStream(inFile, System.IO.FileMode.Open);
try
{
CopyStream(inFileStream, outZStream);
}
finally
{
outZStream.Close();
outFileStream.Close();
inFileStream.Close();
}
} private void decompressFile(string inFile, string outFile)
{
System.IO.FileStream outFileStream = new System.IO.FileStream(outFile, System.IO.FileMode.Create);
zlib.ZOutputStream outZStream = new zlib.ZOutputStream(outFileStream);
System.IO.FileStream inFileStream = new System.IO.FileStream(inFile, System.IO.FileMode.Open);
try
{
CopyStream(inFileStream, outZStream);
}
finally
{
outZStream.Close();
outFileStream.Close();
inFileStream.Close();
}
}

https://stackoverflow.com/questions/6620655/compression-and-decompression-problem-with-zlib-net

老外这也有一份

 public static void CompressData(byte[] inData, out byte[] outData)
{
using (MemoryStream outMemoryStream = new MemoryStream())
using (ZOutputStream outZStream = new ZOutputStream(outMemoryStream, zlibConst.Z_DEFAULT_COMPRESSION))
using (Stream inMemoryStream = new MemoryStream(inData))
{
CopyStream(inMemoryStream, outZStream);
outZStream.finish();
outData = outMemoryStream.ToArray();
}
} public static void DecompressData(byte[] inData, out byte[] outData)
{
using (MemoryStream outMemoryStream = new MemoryStream())
using (ZOutputStream outZStream = new ZOutputStream(outMemoryStream))
using (Stream inMemoryStream = new MemoryStream(inData))
{
CopyStream(inMemoryStream, outZStream);
outZStream.finish();
outData = outMemoryStream.ToArray();
}
} public static void CopyStream(System.IO.Stream input, System.IO.Stream output)
{
byte[] buffer = new byte[2000];
int len;
while ((len = input.Read(buffer, 0, 2000)) > 0)
{
output.Write(buffer, 0, len);
}
output.Flush();
}

zlib压缩相关的更多相关文章

  1. Delphi Base64编码/解码及ZLib压缩/解压

    最近在写的程序与SOAP相关,所以用到了一些Base64编码/解码及数据压缩/解压方面的知识. 在这里来作一些总结:   一.Base64编码/解码   一般用到的是Delphi自带的单元EncdDe ...

  2. Delphi Base64编码_解码及ZLib压缩_解压(转)

    最近在写的程序与SOAP相关,所以用到了一些Base64编码/解码及数据压缩/解压方面的知识. 在这里来作一些总结:一.Base64编码/解码 一般用到的是Delphi自带的单元EncdDecd,当然 ...

  3. zlib压缩一个文件为gzip格式

    网上有很多针对zlib的总结,但是很零散,自己经过总结,实现了用zlib压缩一个文件为gzip格式,似的可以直接使用winr工具解压. 具体方法是使用zlib的deflate系列函数,将buffer压 ...

  4. 常见压缩格式分析,及 Linux 下的压缩相关指令

    可先浏览加粗部分 一.常见压缩档 *.zip | zip 程式壓縮打包的檔案: (很常见,但是因为不包含文件名编码信息,跨平台可能会乱码) *.rar | winrar 程序压缩打包的档案:(在win ...

  5. qt 调用zlib压缩与解压缩功能

    Zlib是一种免费且通用的压缩库,由于Zlib压缩效果比LZW好,而且解压缩速度快,更重要的是商业软件中使用Zlib不需要缴纳版权费,所以很多游戏都使用Zlib压缩资源文件. Zlib是由Jean-l ...

  6. 【13】MD5编码、Zlib压缩解压缩

    1.MD5加密 /// <summary> /// 使用MD5加密算法 /// </summary> /// <param name="md5MessageSt ...

  7. golang zlib 压缩,解压缩

    package main import ( "bytes" "compress/zlib" "fmt" "io" &qu ...

  8. python用模块zlib压缩与解压字符串和文件的方法

    摘自:http://www.jb51.net/article/100218.htm Python标准模块中,有多个模块用于数据的压缩与解压缩,如zipfile,gzip, bz2等等. python中 ...

  9. 浅谈在c#中使用Zlib压缩与解压的方法

    作者:Compasslg 介绍 近期用c#开发一个游戏的存档编辑工具需要用 Zlib 标准的 Deflate 算法对数据进行解压. 在 StackOverflow 上逛了一圈,发现 c# 比较常用到的 ...

随机推荐

  1. 基于appium的常用元素定位方法

    一.元素定位工具 app应用的元素使用的是控件定位,不同于web网页,web网页定位元素通常使用的是F12工具,那么在app当中我们则要借助其它的工具来辅助定位. 1.uiautomatorviewe ...

  2. 解决ie下vue列表数据不能即时刷新的问题

    项目上要兼容IE浏览器(客户要求),发现之前在谷歌浏览器下,操作(增删改查)列表后列表能即时刷新(双向绑定),IE下却不行. 自己调试一下发现,在IE11下,如果GET请求请求相同的URL,默认会使用 ...

  3. Springmvc配置定时任务注解开发

    1.添加命名空间和xsd约束 xmlns:task="http://www.springframework.org/schema/task" http://www.springfr ...

  4. 解决HttpServletRequest的输入流只能读取一次的问题

    背景 通常对安全性有要求的接口都会对请求参数做一些签名验证,而我们一般会把验签的逻辑统一放到过滤器或拦截器里,这样就不用每个接口都去重复编写验签的逻辑. 在一个项目中会有很多的接口,而不同的接口可能接 ...

  5. MySQL 示例数据库

    微软 SQL Server 自带了一些示例数据库,可用于练习和测试.也可作为自己数据库设计时的参考.这些示例数据库开源在了 GitHub,可在 Microsoft/sql-server-samples ...

  6. MySQL的5大引擎及优劣之分

    MySQL提供了多个不同的存储引擎,其中5大引擎有:innodb,myisam,memory,merge,csv. 其中优点有:灾难恢复性好.支持事务.使用行级锁.支持外键关联.支持热备份 缺点如下: ...

  7. 如何在CAD中批量打印图纸?这种方法你要知道

    CAD图纸都是使用CAD制图软件进行设计出来的,图纸的格式均为dwg格式的,不方便进行使用.就需要将图纸进行打印出来.多张CAD图纸如果一张一张进行打印速度就会非常的慢,那就可以使用CAD中的批量打印 ...

  8. qt 使用OpenCV

    使用MinGW编译OpenCV源码 下载OpenCV源码.CMake编译工具 编译安装完: Qt工程配置 INCLUDEPATH += D:/qt_work/opencv/build/install/ ...

  9. 究竟是什么毁了我的impl实现

    Impl模式早就有过接触(本文特指通过指针完成impl),我晓得它具有以下优点: 减少头文件暴露出来的非必要内部类(提供静态库,动态库时尤其重要): 减小文件间的编译依存关系,大型代码库的编译时间就不 ...

  10. [转] Hystrix 使用与分析

    原文地址:http://hot66hot.iteye.com/blog/2155036 转载请注明出处哈:http://hot66hot.iteye.com/blog/2155036 一:为什么需要H ...