82 lines
3.3 KiB
C#
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();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} |