栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > .Net

c#使用zlib.net压缩解压byte数组

.Net 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

c#使用zlib.net压缩解压byte数组

c#使用zlib.net压缩解压byte数组
    • 简单粗暴直接上代码
    • 遇到的小坑

zlib是提供数据压缩用的函式库 ,本文简单介绍zlib.net解压数组碰到的痛点

简单粗暴直接上代码
  public static byte[] Compress(byte[] bytes)
        {
            return bytes;
            if (bytes.Length < 2)
            {
                return bytes;
            }

            using (var ms = new System.IO.MemoryStream())
            {
                using (ZOutputStream outZStream = new ZOutputStream(ms, zlibConst.Z_BEST_COMPRESSION))
                {
                    outZStream.Write(bytes, 0, bytes.Length);
                    outZStream.Flush();
                }

                return ms.ToArray();
            }
        }

        public static byte[] Uncompress(byte[] bytes)
        {
            //小于2个字节肯定是非压缩的
            if (bytes.Length < 2)
            {
                return bytes;
            }

            //判断是否是压缩数据,是才执行解开压缩操作
            if (0x78 != bytes[0])
            {
                return bytes;
            }
			
			//注意这里,这是遇到的小坑
            if (0x9C != bytes[1] && 0xDA != bytes[1])
            {
                return bytes;
            }

            using (var ms = new MemoryStream())
            {
                using (ZOutputStream outZStream = new ZOutputStream(ms))
                {
                    outZStream.Write(bytes, 0, bytes.Length);
                    outZStream.Flush();
                }

                return ms.ToArray();
            }
        }
遇到的小坑

精髓就在下面的代码块中,对0x78这块由于之前有印象,所以直接加上了,但解压的时候还有时候报错,因为zlib自动生成的头部有2个字节的含义

 //判断是否是压缩数据,是才执行解开压缩操作
            if (0x78 != bytes[0])
            {
                return bytes;
            }
			
			//注意这里,这是遇到的小坑
            if (0x9C != bytes[1] && 0xDA != bytes[1])
            {
                return bytes;
            }

头部两个字节,定义压缩类型
|--------- |----------|
|CMF |LEVEL |

CMF: OX78 即首字节byte[0],表示压缩格式为ZIP
LEVEL: 0xDA 即首字节byte[1],表示压缩的等级
对应压缩时所选的等级zlibConst.Z_BEST_COMPRESSION

解压出错的两种情况,第一次是由于没有加入bytes[1]限制,导致有些压缩部分解压出错
修复后又出现是因为 byte[1] 判断的等级和压缩时所选择的等级不一致导致的

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/910863.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号