52 lines
1.6 KiB
C#
52 lines
1.6 KiB
C#
|
|
using System.IO.Compression;
|
|||
|
|
|
|||
|
|
namespace PARR.Infrastructure.Redis.Helpers
|
|||
|
|
{
|
|||
|
|
/// <summary>
|
|||
|
|
/// Архивация/разарзивация данных
|
|||
|
|
/// </summary>
|
|||
|
|
internal static class CompressionHelper
|
|||
|
|
{
|
|||
|
|
// Не сжимать маленькие значения
|
|||
|
|
private const int MinCompressionSize = 1024; // 1Кб
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// Сжать
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="data"></param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public static byte[] Compress(byte[] data)
|
|||
|
|
{
|
|||
|
|
if (data.Length < MinCompressionSize)
|
|||
|
|
return data;
|
|||
|
|
|
|||
|
|
using var output = new MemoryStream();
|
|||
|
|
using (var gzip = new GZipStream(output, CompressionLevel.Optimal))
|
|||
|
|
{
|
|||
|
|
gzip.Write(data, 0, data.Length);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return output.ToArray();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// Разархивировать если это GZip
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="data"></param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public static byte[] Decompress(byte[] data)
|
|||
|
|
{
|
|||
|
|
// Проверяем сигнатуру GZip (0x1F, 0x8B)
|
|||
|
|
if (data.Length < 2 || data[0] != 0x1F || data[1] != 0x8B)
|
|||
|
|
return data; // Не сжато
|
|||
|
|
|
|||
|
|
using var input = new MemoryStream(data);
|
|||
|
|
using var gzip = new GZipStream(input, CompressionMode.Decompress);
|
|||
|
|
using var output = new MemoryStream();
|
|||
|
|
gzip.CopyTo(output);
|
|||
|
|
|
|||
|
|
return output.ToArray();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|