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手机上测试了下,功能正常,接下来还需要多测一测才好。

posted @ 2020-12-12 11:45  zs_3718  阅读(1083)  评论(0编辑  收藏  举报