C# 字符串压缩结果为字符串

C# 字符串压缩结果为字符串,c#,compression,C#,Compression,我在互联网上创建了以下用于字符串压缩的代码。当我压缩一个简单的字符串时,返回值是非常不同的 例如,Compress(“abc”)返回“AwAAAB+lcaaaaaabadtvqdghemwjsyvbcp7f0r1stfgdkeiggatjniqbdswyjn5plshwlhiymrkkohkzvzlxwywqmztnbz33nvvvvffee++997o7nU4n99//p1xmzafs9s5k2kmeiycqyb8/fnwfPyKyyfT/acjbjdudaaa” 我可以接受简单的字符串结果吗

我在互联网上创建了以下用于字符串压缩的代码。当我压缩一个简单的字符串时,返回值是非常不同的

例如,Compress(“abc”)返回“AwAAAB+lcaaaaaabadtvqdghemwjsyvbcp7f0r1stfgdkeiggatjniqbdswyjn5plshwlhiymrkkohkzvzlxwywqmztnbz33nvvvvffee++997o7nU4n99//p1xmzafs9s5k2kmeiycqyb8/fnwfPyKyyfT/acjbjdudaaa”

我可以接受简单的字符串结果吗

谢谢

using System.IO.Compression;
using System.Text;
using System.IO;

public static string Compress(string text)
{
byte[] buffer = Encoding.UTF8.GetBytes(text);
MemoryStream ms = new MemoryStream();
using (GZipStream zip = new GZipStream(ms, CompressionMode.Compress, true))
{
zip.Write(buffer, 0, buffer.Length);
}

ms.Position = 0;
MemoryStream outStream = new MemoryStream();

byte[] compressed = new byte[ms.Length];
ms.Read(compressed, 0, compressed.Length);

byte[] gzBuffer = new byte[compressed.Length + 4];
System.Buffer.BlockCopy(compressed, 0, gzBuffer, 4, compressed.Length);
System.Buffer.BlockCopy(BitConverter.GetBytes(buffer.Length), 0, gzBuffer, 0, 4);
return Convert.ToBase64String (gzBuffer);
}

您使用的代码旨在压缩非常大的字符串。它使用压缩算法压缩源字符串,然后使用编码使其可读(或可用/“可通过”)

将源字符串扩展到~1.33倍大(8位符号编码为6位+2位溢出,用于下一个符号)。所以,为了使字符串有意义,必须将其压缩到源长度的至少70%

使用该编码时,结果是预期的和通常的

要回答您的问题,请定义“简单字符串结果”的含义


您使用的代码旨在压缩非常大的字符串。它使用压缩算法压缩源字符串,然后使用编码使其可读(或可用/“可通过”)

将源字符串扩展到~1.33倍大(8位符号编码为6位+2位溢出,用于下一个符号)。所以,为了使字符串有意义,必须将其压缩到源长度的至少70%

使用该编码时,结果是预期的和通常的

要回答您的问题,请定义“简单字符串结果”的含义


当然,因为结果在base64中(请参阅代码中的最后一行)。

当然,因为结果在base64中(请参阅代码中的最后一行)。

压缩并不总是导致较小的输出,原因如下:

  • 输入可能是完全随机的,在这种情况下,大多数压缩不会压缩任何内容,但仍需要保存解压缩“指令”。压缩这些数据的结果是数据+指令…更大
  • 输入没有使用的压缩算法搜索的特征。这与前一种情况非常相似,只是它依赖于所使用的压缩算法(在您的案例Gzip中)
  • 非常小的输入。输入越小,在其中找到可压缩段的机会就越小,因此很有可能得到伪随机输入(不是随机的,但很小,看起来是随机的),我们再次回到第一种情况

  • Base64是这里的一个重点,是的,但是不要忘记这些关于压缩的小事实。

    压缩并不总是导致较小的输出,原因如下:

  • 输入可能是完全随机的,在这种情况下,大多数压缩不会压缩任何内容,但仍需要保存解压缩“指令”。压缩这些数据的结果是数据+指令…更大
  • 输入没有使用的压缩算法搜索的特征。这与前一种情况非常相似,只是它依赖于所使用的压缩算法(在您的案例Gzip中)
  • 非常小的输入。输入越小,在其中找到可压缩段的机会就越小,因此很有可能得到伪随机输入(不是随机的,但很小,看起来是随机的),我们再次回到第一种情况

  • Base64是这里的一个重点,是的,但是不要忘记这些关于压缩的小事实。

    例如,当我压缩一个Guid值,如“3F2504E0-4F89-11D3-9A0C-0305E82C3301”,预期的返回值是“7QDBkvCA1+B9K/U0vrQx1A--”。但compress方法返回“h4siaaaaaaeao29b2acszylji9tynt/SvVK1+b0qiaybmk2jbaeozbim3mkuwda…”我如何获取“7QDBkvCA1+B9K/U0vrQx1A--”值?为什么期望这样?当通过GZip压缩时,结果将包含压缩使用的Zip头和字典。所以它可以扩展基本数据,特别是这么短的数据。您可能想要
    Convert.ToBase64String(guid.ToByteArray())
    ?但如果需要,您可以简单地传递guid的原始字符串表示形式,而不进行任何编码。例如,当我压缩guid值“3F2504E0-4F89-11D3-9A0C-0305E82C3301”时,预期返回值为“7QDBkvCA1+B9K/U0vrQx1A--”。但compress方法返回“h4siaaaaaaeao29b2acszylji9tynt/SvVK1+b0qiaybmk2jbaeozbim3mkuwda…”我如何获取“7QDBkvCA1+B9K/U0vrQx1A--”值?为什么期望这样?当通过GZip压缩时,结果将包含压缩使用的Zip头和字典。所以它可以扩展基本数据,特别是这么短的数据。您可能想要
    Convert.ToBase64String(guid.ToByteArray())
    ?但是,如果需要的话,您可以简单地传递guid的原始字符串表示形式,而无需任何编码。