//------------------------------------------------------------ // Game Framework // Copyright © 2013-2021 loyalsoft. All rights reserved. // Homepage: http://www.game7000.com/ // Feedback: http://www.game7000.com/ //------------------------------------------------------------ using System; using System.IO; namespace GameFramework { public static partial class Utility { /// /// 压缩解压缩相关的实用函数。 /// public static partial class Compression { private static ICompressionHelper s_CompressionHelper = null; /// /// 设置压缩解压缩辅助器。 /// /// 要设置的压缩解压缩辅助器。 public static void SetCompressionHelper(ICompressionHelper compressionHelper) { s_CompressionHelper = compressionHelper; } /// /// 压缩数据。 /// /// 要压缩的数据的二进制流。 /// 压缩后的数据的二进制流。 public static byte[] Compress(byte[] bytes) { if (bytes == null) { throw new GameFrameworkException("Bytes is invalid."); } return Compress(bytes, 0, bytes.Length); } /// /// 压缩数据。 /// /// 要压缩的数据的二进制流。 /// 压缩后的数据的二进制流。 /// 是否压缩数据成功。 public static bool Compress(byte[] bytes, Stream compressedStream) { if (bytes == null) { throw new GameFrameworkException("Bytes is invalid."); } return Compress(bytes, 0, bytes.Length, compressedStream); } /// /// 压缩数据。 /// /// 要压缩的数据的二进制流。 /// 要压缩的数据的二进制流的偏移。 /// 要压缩的数据的二进制流的长度。 /// 压缩后的数据的二进制流。 public static byte[] Compress(byte[] bytes, int offset, int length) { using (MemoryStream compressedStream = new MemoryStream()) { if (Compress(bytes, offset, length, compressedStream)) { return compressedStream.ToArray(); } else { return null; } } } /// /// 压缩数据。 /// /// 要压缩的数据的二进制流。 /// 要压缩的数据的二进制流的偏移。 /// 要压缩的数据的二进制流的长度。 /// 压缩后的数据的二进制流。 /// 是否压缩数据成功。 public static bool Compress(byte[] bytes, int offset, int length, Stream compressedStream) { if (s_CompressionHelper == null) { throw new GameFrameworkException("Compressed helper is invalid."); } if (bytes == null) { throw new GameFrameworkException("Bytes is invalid."); } if (offset < 0 || length < 0 || offset + length > bytes.Length) { throw new GameFrameworkException("Offset or length is invalid."); } if (compressedStream == null) { throw new GameFrameworkException("Compressed stream is invalid."); } try { return s_CompressionHelper.Compress(bytes, offset, length, compressedStream); } catch (Exception exception) { if (exception is GameFrameworkException) { throw; } throw new GameFrameworkException(Text.Format("Can not compress with exception '{0}'.", exception), exception); } } /// /// 压缩数据。 /// /// 要压缩的数据的二进制流。 /// 压缩后的数据的二进制流。 public static byte[] Compress(Stream stream) { using (MemoryStream compressedStream = new MemoryStream()) { if (Compress(stream, compressedStream)) { return compressedStream.ToArray(); } else { return null; } } } /// /// 压缩数据。 /// /// 要压缩的数据的二进制流。 /// 压缩后的数据的二进制流。 /// 是否压缩数据成功。 public static bool Compress(Stream stream, Stream compressedStream) { if (s_CompressionHelper == null) { throw new GameFrameworkException("Compressed helper is invalid."); } if (stream == null) { throw new GameFrameworkException("Stream is invalid."); } if (compressedStream == null) { throw new GameFrameworkException("Compressed stream is invalid."); } try { return s_CompressionHelper.Compress(stream, compressedStream); } catch (Exception exception) { if (exception is GameFrameworkException) { throw; } throw new GameFrameworkException(Text.Format("Can not compress with exception '{0}'.", exception), exception); } } /// /// 解压缩数据。 /// /// 要解压缩的数据的二进制流。 /// 解压缩后的数据的二进制流。 public static byte[] Decompress(byte[] bytes) { if (bytes == null) { throw new GameFrameworkException("Bytes is invalid."); } return Decompress(bytes, 0, bytes.Length); } /// /// 解压缩数据。 /// /// 要解压缩的数据的二进制流。 /// 解压缩后的数据的二进制流。 /// 是否解压缩数据成功。 public static bool Decompress(byte[] bytes, Stream decompressedStream) { if (bytes == null) { throw new GameFrameworkException("Bytes is invalid."); } return Decompress(bytes, 0, bytes.Length, decompressedStream); } /// /// 解压缩数据。 /// /// 要解压缩的数据的二进制流。 /// 要解压缩的数据的二进制流的偏移。 /// 要解压缩的数据的二进制流的长度。 /// 解压缩后的数据的二进制流。 public static byte[] Decompress(byte[] bytes, int offset, int length) { using (MemoryStream decompressedStream = new MemoryStream()) { if (Decompress(bytes, offset, length, decompressedStream)) { return decompressedStream.ToArray(); } else { return null; } } } /// /// 解压缩数据。 /// /// 要解压缩的数据的二进制流。 /// 要解压缩的数据的二进制流的偏移。 /// 要解压缩的数据的二进制流的长度。 /// 解压缩后的数据的二进制流。 /// 是否解压缩数据成功。 public static bool Decompress(byte[] bytes, int offset, int length, Stream decompressedStream) { if (s_CompressionHelper == null) { throw new GameFrameworkException("Compressed helper is invalid."); } if (bytes == null) { throw new GameFrameworkException("Bytes is invalid."); } if (offset < 0 || length < 0 || offset + length > bytes.Length) { throw new GameFrameworkException("Offset or length is invalid."); } if (decompressedStream == null) { throw new GameFrameworkException("Decompressed stream is invalid."); } try { return s_CompressionHelper.Decompress(bytes, offset, length, decompressedStream); } catch (Exception exception) { if (exception is GameFrameworkException) { throw; } throw new GameFrameworkException(Text.Format("Can not decompress with exception '{0}'.", exception), exception); } } /// /// 解压缩数据。 /// /// 要解压缩的数据的二进制流。 /// 是否解压缩数据成功。 public static byte[] Decompress(Stream stream) { using (MemoryStream decompressedStream = new MemoryStream()) { if (Decompress(stream, decompressedStream)) { return decompressedStream.ToArray(); } else { return null; } } } /// /// 解压缩数据。 /// /// 要解压缩的数据的二进制流。 /// 解压缩后的数据的二进制流。 /// 是否解压缩数据成功。 public static bool Decompress(Stream stream, Stream decompressedStream) { if (s_CompressionHelper == null) { throw new GameFrameworkException("Compressed helper is invalid."); } if (stream == null) { throw new GameFrameworkException("Stream is invalid."); } if (decompressedStream == null) { throw new GameFrameworkException("Decompressed stream is invalid."); } try { return s_CompressionHelper.Decompress(stream, decompressedStream); } catch (Exception exception) { if (exception is GameFrameworkException) { throw; } throw new GameFrameworkException(Text.Format("Can not decompress with exception '{0}'.", exception), exception); } } } } }