Files

82 lines
3.3 KiB
C#

using System.IO;
using System.IO.Compression;
namespace EmbedIO.Internal
{
internal static class CompressionUtility
{
public static byte[]? ConvertCompression(byte[] source, CompressionMethod sourceMethod, CompressionMethod targetMethod)
{
if (source == null)
return null;
if (sourceMethod == targetMethod)
return source;
switch (sourceMethod)
{
case CompressionMethod.Deflate:
using (var sourceStream = new MemoryStream(source, false))
{
using var decompressionStream = new DeflateStream(sourceStream, CompressionMode.Decompress, true);
using var targetStream = new MemoryStream();
if (targetMethod == CompressionMethod.Gzip)
{
using var compressionStream = new GZipStream(targetStream, CompressionMode.Compress, true);
decompressionStream.CopyTo(compressionStream);
}
else
{
decompressionStream.CopyTo(targetStream);
}
return targetStream.ToArray();
}
case CompressionMethod.Gzip:
using (var sourceStream = new MemoryStream(source, false))
{
using var decompressionStream = new GZipStream(sourceStream, CompressionMode.Decompress, true);
using var targetStream = new MemoryStream();
if (targetMethod == CompressionMethod.Deflate)
{
using var compressionStream = new DeflateStream(targetStream, CompressionMode.Compress, true);
decompressionStream.CopyToAsync(compressionStream);
}
else
{
decompressionStream.CopyTo(targetStream);
}
return targetStream.ToArray();
}
default:
using (var sourceStream = new MemoryStream(source, false))
{
using var targetStream = new MemoryStream();
switch (targetMethod)
{
case CompressionMethod.Deflate:
using (var compressionStream = new DeflateStream(targetStream, CompressionMode.Compress, true))
sourceStream.CopyTo(compressionStream);
break;
case CompressionMethod.Gzip:
using (var compressionStream = new GZipStream(targetStream, CompressionMode.Compress, true))
sourceStream.CopyTo(compressionStream);
break;
default:
// Just in case. Consider all other values as None.
return source;
}
return targetStream.ToArray();
}
}
}
}
}