Unity使用System.IO.Compression解压数据
先贴代码:
public static byte[] DecompressBytes(byte[] sourceByte, int headerSize = 0) { using (MemoryStream inputStream = new MemoryStream(sourceByte)) { byte[] result = null; using (MemoryStream outputStream = DecompressStream(inputStream, headerSize)) { result = outputStream.ToArray(); } return result; } } private static MemoryStream DecompressStream(Stream sourceStream, int headerSize = 0) { MemoryStream outStream = new MemoryStream(); sourceStream.Position = headerSize; using (var decompressionStream = new DeflateStream(sourceStream, CompressionMode.Decompress)) { decompressionStream.CopyTo(outStream); } return outStream; }
一开始解压服务器传过来的数据会报异常"Exception has been thrown by the target of an invocation",查到篇文章说要看InnerException信息才知道具体问题,发现其实真实异常是"Corrupted data ReadInternal",又查了些相关文章,终于找到一篇说出了问题所在,就是这里的解压是要忽略header的(一般是0x78 0x9C)。
题外话,其实一开始没打算用这个,因为搜出来的头几篇文章都说Unity使用这个在Android平台会报错,推荐使用一个修改库Unity.IO.Compression,但是项目已经上线不能强更。然后查到项目里曾经有人加入过别的dll库中有zlib,虽然网上找不到文档,但是凭借着搜索引擎还是实现了功能,在电脑上也测试通过了,但是到手机上又报错了。查看输出日志报找不到API,看来是被剔除掉了,所以才又回头来想试试System.IO.Compression,之后又有篇文章提到之所以会报错,是因为Unity使用的Mono太老了,如果项目使用的是IL2CPP的话就不会有问题。目前只在一部Android手机上测试了下,功能正常,接下来还需要多测一测才好。