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


版权声明:本文为wawa1203原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。