cs
复制代码
public class Program
{
/*
简介:Gzip是一种基于DEFLATE算法的无损数据压缩算法,广泛应用于文件压缩和网络数据传输。
算法:DEFLATE 算法 = LZ77字典编码 + 霍夫曼编码
适用场景:大量重复内容文本、长文本
*/
/// <summary>
/// 压缩
/// </summary>
public static string CompressString(string text)
{
byte[] buffer = Encoding.UTF8.GetBytes(text);
byte[] compressedData = null;
using (var memoryStream = new MemoryStream())
{
using (var gZipStream = new GZipStream(memoryStream, CompressionMode.Compress, true))
{
gZipStream.Write(buffer, 0, buffer.Length);
}
memoryStream.Position = 0;
compressedData = new byte[memoryStream.Length];
memoryStream.Read(compressedData, 0, compressedData.Length);
}
var gZipBuffer = new byte[compressedData.Length + 4];
Buffer.BlockCopy(compressedData, 0, gZipBuffer, 4, compressedData.Length);
Buffer.BlockCopy(BitConverter.GetBytes(buffer.Length), 0, gZipBuffer, 0, 4);
return Convert.ToBase64String(gZipBuffer);
}
/// <summary>
/// 解压
/// </summary>
public static string DecompressString(string compressedText)
{
byte[] gZipBuffer = Convert.FromBase64String(compressedText);
using (var memoryStream = new MemoryStream())
{
int dataLength = BitConverter.ToInt32(gZipBuffer, 0);
memoryStream.Write(gZipBuffer, 4, gZipBuffer.Length - 4);
var buffer = new byte[dataLength];
memoryStream.Position = 0;
using (var gZipStream = new GZipStream(memoryStream, CompressionMode.Decompress))
{
gZipStream.Read(buffer, 0, buffer.Length);
}
return Encoding.UTF8.GetString(buffer);
}
}
static async Task Main(string[] args)
{
// 测试1:高度重复的文本
var repetitiveText = new string('A', 1000) + new string('B', 1000) + new string('C', 1000);
Console.WriteLine($"重复文本原始长度: {repetitiveText.Length}");
var compressed1 = CompressString(repetitiveText);
Console.WriteLine($"重复文本压缩后: {compressed1.Length}");
Console.WriteLine($"压缩比: {(double)compressed1.Length / repetitiveText.Length:P}");
// 测试2:你的原始文本
var originalText = ""ConsoleApp1.exe"(CoreCLR: clrhost): 已加载...";
Console.WriteLine($"\n原始文本长度: {originalText.Length}");
var compressed2 = CompressString(originalText);
Console.WriteLine($"原始文本压缩后: {compressed2.Length}");
Console.WriteLine($"压缩比: {(double)compressed2.Length / originalText.Length:P}");
// 测试3:JSON数据(通常压缩效果好)
var jsonText = "{\"name\":\"John\",\"age\":30,\"city\":\"New York\"}".Repeat(50);
Console.WriteLine($"\nJSON文本长度: {jsonText.Length}");
var compressed3 = CompressString(jsonText);
Console.WriteLine($"JSON文本压缩后: {compressed3.Length}");
Console.WriteLine($"压缩比: {(double)compressed3.Length / jsonText.Length:P}");
}
}