C#压缩和解压缩字节(GZip)
标题:C#压缩和解压缩字节(GZip的使用)
作用:此类在 .NET Framework 2.0 版中是新增的。提供用于压缩和解压缩流的方法和属性。
定义:表示 GZip 数据格式,它使用无损压缩和解压缩文件的行业标准算法。这种格式包括一个检测数据损坏的循环冗余校验值。GZip 数据格式使用的算法与 DeflateStream 类的算法相同,但它可以扩展以使用其他压缩格式。这种格式可以通过不涉及专利使用权的方式轻松实现。gzip 的格式可以从 RFC 1952“GZIP file format specification 4.3(GZIP 文件格式规范 4.3)GZIP file format specification 4.3(GZIP 文件格式规范 4.3)”中获得。此类不能用于压缩大于 4 GB 的文件。
下面给出两个具体Demo:
实例1
- //压缩字节
- //1.创建压缩的数据流
- //2.设定compressStream为存放被压缩的文件流,并设定为压缩模式
- //3.将需要压缩的字节写到被压缩的文件流
- public static byte[] CompressBytes(byte[] bytes)
- {
- using(MemoryStream compressStream = new MemoryStream())
- {
- using(var zipStream = new GZipStream(compressStream, CompressMode.ComPress))
- zipStream.Write(bytes, , bytes.Length);
- return compressStream.ToArray();
- }
- }
- //解压缩字节
- //1.创建被压缩的数据流
- //2.创建zipStream对象,并传入解压的文件流
- //3.创建目标流
- //4.zipStream拷贝到目标流
- //5.返回目标流输出字节
- public static byte[] Decompress(byte[] bytes)
- {
- using(var compressStream = new MemoryStream(bytes))
- {
- using(var zipStream = new GZipStream(compressStream, CompressMode.DeCompress))
- {
- using(var resultStream = new MemoryStream())
- {
- zipStream.CopyTo(resultStream);
- return resultStream.ToArray();
- }
- }
- }
- }
实例2(摘自MSDN):
- class Program
- {
- public static int ReadAllBytesFromStream(Stream stream, byte[] buffer)
- {
- int offset = ;
- int totalCount = ;
- while (true)
- {
- int bytesRead = stream.Read(buffer, offset, );
- if (bytesRead == )
- {
- break;
- }
- offset += bytesRead;
- totalCount += bytesRead;
- }
- return totalCount;
- }
- public static bool CompareData(byte[] buf1, int len1, byte[] buf2, int len2)
- {
- if (len1 != len2)
- {
- Console.WriteLine("Number of bytes in two buffer are diffreent {0}:{1}", len1, len2);
- return false;
- }
- for (int i = ; i < len1; i++)
- {
- if (buf1[i] != buf2[i])
- {
- Console.WriteLine("byte {0} is different {1}{2}", i, buf1[i], buf2[i]);
- return false;
- }
- }
- Console.WriteLine("All byte compare true");
- return true;
- }
- public static void GZipCompressDecompress(string fileName)
- {
- Console.WriteLine("Test compresssion and decompression on file {0}", fileName);
- FileStream infile;
- try
- {
- //Comopress
- infile = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read);
- byte[] buffer = new byte[infile.Length];
- int count = infile.Read(buffer, , buffer.Length);
- if (count != buffer.Length)
- {
- infile.Close();
- infile.Dispose();
- Console.WriteLine("Test Failed: Unable to read data from file");
- return;
- }
- infile.Close();
- MemoryStream ms = new MemoryStream();
- GZipStream compressGZipStream = new GZipStream(ms, CompressionMode.Compress, true);
- Console.WriteLine("Compression");
- compressGZipStream.Write(buffer, , buffer.Length); //从指定字节数组中将压缩的字节写入基础流
- compressGZipStream.Close();
- Console.WriteLine("Original size:{0}, Compressed size:{1}", buffer.Length, ms.ToArray().Length);
- //DeCompress
- ms.Position = ;
- GZipStream deCompressGZipStream = new GZipStream(ms, CompressionMode.Decompress);
- Console.WriteLine("Decompression");
- byte[] decompressedBuffer = new byte[buffer.Length + ];
- int totalCount = ReadAllBytesFromStream(deCompressGZipStream, decompressedBuffer);
- Console.WriteLine("Decompressed {0} bytes", totalCount);
- if (!CompareData(buffer, buffer.Length, decompressedBuffer, decompressedBuffer.Length))
- {
- Console.WriteLine("Error. The two buffers did not compare.");
- }
- deCompressGZipStream.Dispose();
- }
- catch (ArgumentNullException)
- {
- Console.WriteLine("ArgumentNullException:{0}", "Error: The path is null.");
- }
- catch (ArgumentException)
- {
- Console.WriteLine("ArgumentException:{0}", "Error: path is a zero-length string, contains an empty string or one more invlaid characters");
- }
- catch (NotSupportedException)
- {
- Console.WriteLine("NotSupportedException:{0}", "Cite no file, such as 'con:'、'com1'、'lpt1' in NTFS");
- }
- catch (FileNotFoundException)
- {
- Console.WriteLine("FileNotFoundException:{0]", "Find no file");
- }
- catch (IOException)
- {
- Console.WriteLine("IOException:{0}", "Occur I/O error");
- }
- catch (System.Security.SecurityException)
- {
- Console.WriteLine("System.Security.SecurityException{0}:", "The calls has no permission");
- }
- catch (UnauthorizedAccessException)
- {
- Console.WriteLine("UnauthorizedAccessException:{0}", "path specified a file that is read-only, the path is a directory, " +
- "or caller does not have the required permissions");
- }
- }
- static void Main(string[] args)
- {
- GZipCompressDecompress(@"D:\config.ini");
- }
- }
C#压缩和解压缩字节(GZip)的更多相关文章
- Linux下的压缩和解压缩命令——gzip/gunzip
gzip命令 gzip命令用来压缩文件.gzip是个使用广泛的压缩程序,文件经它压缩过后,其名称后面会多处".gz"扩展名. gzip是在Linux系统中经常使用的一个对文件进行压 ...
- java工具类——java将一串数据按照gzip方式压缩和解压缩
我要整理在工作中用到的工具类分享出来,也方便自己以后查阅使用,这些工具类都是我自己实际工作中使用的 import java.io.ByteArrayInputStream; import java.i ...
- Linux下的压缩和解压缩命令gzip/gunzip
作者:邓聪聪 Linux下的压缩和解压缩命令——gzip/gunzip yum -y install zip gzip (--安装压缩工具) gzip命令 gzip命令用来压缩文件.gzip是个使用广 ...
- .net 利用 GZipStream 压缩和解压缩
1.GZipStream 类 此类在 .NET Framework 2.0 版中是新增的. 提供用于压缩和解压缩流的方法和属性 2.压缩byte[] /// <summary> /// 压 ...
- 使用commons-compress操作zip文件(压缩和解压缩)
http://www.cnblogs.com/luxh/archive/2012/06/28/2568758.html Apache Commons Compress是一个压缩.解压缩文件的类库. 可 ...
- 利用SharpZipLib进行字符串的压缩和解压缩
http://www.izhangheng.com/sharpziplib-string-compression-decompression/ 今天搞了一晚上压缩和解压缩问题,java压缩的字符串,用 ...
- Linux常用命令学习3---(文件的压缩和解压缩命令zip unzip tar、关机和重启命令shutdown reboot……)
1.压缩和解压缩命令 常用压缩格式:.zip..gz..bz2..tar.gz..tar.bz2..rar .zip格式压缩和解压缩命令 zip 压缩文件名 源文件:压缩文件 ...
- 关于webservice大数据量传输时的压缩和解压缩
当访问WebSerivice时,如果数据量很大,传输数据时就会很慢.为了提高速度,我们就会想到对数据进行压缩.首先我们来分析一下. 当在webserice中传输数据时,一般都采用Dataset进行数据 ...
- 在C#中利用SharpZipLib进行文件的压缩和解压缩收藏
我在做项目的时候需要将文件进行压缩和解压缩,于是就从http://www.icsharpcode.net(http://www.icsharpcode.net/OpenSource/SharpZipL ...
随机推荐
- mac下安装postgreSql
在 mac 下,可以利用 homebrew 直接安装 PostgreSQL: 1 brew install postgresql -v 稍等片刻,PostgreSQL 就安装完成.接下来就是初始数据库 ...
- 网易NAPM Andorid SDK实现原理--转
原文地址:https://neyoufan.github.io/2017/03/10/android/NAPM%20Android%20SDK/ NAPM 是网易的应用性能管理平台,采用非侵入的方式获 ...
- PHP 环境搭建工具
PHP环境搭建工具 一键集成工具 直接安装后部署到相关目录即可浏览 phpStudy 下载地址:https://pan.baidu.com/s/1i6C3Ph7
- 截图 gif 图小工具
GifCam gyazo gyazo.com Windows 10 中的内置截屏(Win+G)
- jsp+jdbc实现用户登录
1.1 创建数据库表 表名:user 字段: userid 保存用户的登录id name 用户名 password 密码 1.2 实现思路 a. 用户登录,则需要有个一个表单页,此页面可输 ...
- python3三级菜单的访问,并按q退出
#/usr/bin/env python#yehui'''作业三:多级菜单 三级菜单 可依次选择进入各子菜单 所需新知识点:列表.字典'''import readlineclass MultiLeve ...
- 关于samsung连接BLE设备的一些资料汇总和开发过程一些经验总结
1 忙了这么久,终于有时间把最近几个月弄的东西整理一下,顺便我的开发过程和经历. 被公司分到做一个蓝牙4.0的项目,对这种软硬结合的东西也比较感兴趣,所以很快投入到android蓝牙4.0的项目中来. ...
- StringUtils 的填充方法
注意:两个参数的用空格填充,三个参数的用后面的参数填充 第一个参数要填充的字符串,第二个是需要的长度,第三个是以什么填充. 左侧填充: leftPad(): StringUtils.leftPad(S ...
- 常用js方法封装
常用js方法封装 var myJs = { /* * 格式化日期 * @param dt 日期对象 * @returns {string} 返回值是格式化的字符串日期 */ getDates: fun ...
- 【转】 c#中两个DateTimePicker,一个时间设置为0:0:0,另一个设置为23:59:59
[转] c#中两个DateTimePicker,一个时间设置为0:0:0,另一个设置为23:59:59 stp1为第一个DateTimePicker this.dtp1.Value=this.dtp1 ...