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] 判断的等级和压缩时所选择的等级不一致导致的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值