using System.IO.Compression;
public static class Program
public static void Main()
string[] urls = new string[]
"https://stackoverflow.com/questions/71884821/is-there-any-invertible-way-in-c-to-convert-a-string-into-a-smaller-one-an#comment127033258_71884821",
"https://github.com/dotnet/runtime/blob/2d4f2d0c8f60d5f49e39f3ddbe1824648ee2b306/src/libraries/System.Private.CoreLib/src/System/Text/Encoding.cs#L77",
"https://sharplab.io/#v2:CYLg1APgAgTAjAWAFBQMwAJabgdmQb2XWMwygBZ0BZAQwEsA7ACgEoiTCkTvsBOJgEQAJAKYAbMQHt0Ad0kAnMcAEsA3O2IBfZJqA===",
foreach (var original in urls)
Console.WriteLine($"Original: {original.Length} chars, {original.Substring(0, 50)}...");
var compressed = Compress(original);
double compression = (original.Length - compressed.Length) / (double)original.Length;
Console.WriteLine($"Compressed: {compressed.Length} chars, compression: {compression:0.00%}");
var decompressed = Decompress(compressed);
Console.WriteLine($"Decompressed: {decompressed.Length} chars");
Console.WriteLine($"Successful: {decompressed == original}");
static string Compress(string value)
byte[] bytes = Encoding.UTF8.GetBytes(value);
using var input = new MemoryStream(bytes);
using var output = new MemoryStream();
using (var gz = new GZipStream(output, CompressionLevel.SmallestSize))
byte[] result = output.ToArray();
return Encoding.Latin1.GetString(result);
static string Decompress(string compressedValue)
byte[] bytes = Encoding.Latin1.GetBytes(compressedValue);
using var input = new MemoryStream(bytes);
using var output = new MemoryStream();
using (var gz = new GZipStream(input, CompressionMode.Decompress))
byte[] result = output.ToArray();
return Encoding.UTF8.GetString(result);