为QueryString压缩大约1000个字节的文本

时间:2009-09-18 16:34:01

标签: c# compression query-string

我想创建一个机制(在C#中),其中来自QueryString的文本显示在网站上。

例如,在C#中我可能真的会这样做;

public void Page_Load(blah)
{
      litSomething.text = Reques.QueryString["msg"];
}

假设消息是用英文写的(允许UTF8很好),并且不超过1000个字符。我想尽可能地压缩这个文本,并且仍然可以将它放在QueryString中。

我们可以预先定义尽可能多的字典术语(很好的理由?)。服务器端代码将对消息进行编码和解码。

(显然我将添加所有常用的XSS保护,HttpUtitlity.HtmlEncode等类型的东西。还有指向免费字典源的指针会很好!)

任何提示,adivce,源代码?在你问之前,这不是我的功课!

更新
谢谢你的建议。我想让这个GET,所以人们IM /电子邮件URL。我按照bit.ly的思路思考,这本身也是一种欺骗。希望这是一个通用的“短文本压缩”问题。

3 个答案:

答案 0 :(得分:8)

嗯,眼前的问题是:

  • 压缩的结果基本上是二进制的,所以你需要对它进行base64编码,这将使它再次变大1/3。 (您也应该使用websafe base64编码。)
  • 没有压缩算法总能减少文本的大小

这意味着如果您无法处理查询字符串中的(比方说)~1300个字符,则无法保证它始终有效。 (正如Marc所说,如果你可能的话,请使用POST的主体......那么你可能首先忽略压缩。)

如果你对这些人感到满意,那么你的情况与其他任何事情都没有什么不同:

  • 将字符串编码为字节
  • 压缩
  • 使用Convert.ToBase64String将压缩的字节转换回文本(然后替换web-nasty字符)

另一方面,反过来应用相同的转换。

鉴于压缩API是基于流的,您可以使用StreamWriter来避免首先从文本显式转换为二进制。

答案 1 :(得分:6)

您可以将字符串编码为UTF-8,以便获得可以压缩的字节数组。结果也是一个字节数组,因此您可以使用Base-64编码将其作为字符串:

private static string Compress(string data) {
   using (MemoryStream ms = new MemoryStream()) {
      using (GZipStream zip = new GZipStream(ms, CompressionMode.Compress, true)) {
         zip.Write(Encoding.UTF8.GetBytes(data), 0, data.Length);
      }
      return Convert.ToBase64String(ms.ToArray());
   }
}

解压缩就是另一种方式:

private static string Decompress(string data) {
   using (MemoryStream ms = new MemoryStream(Convert.FromBase64String(data))) {
      using (GZipStream zip = new GZipStream(ms, CompressionMode.Decompress, true)) {
         using (BinaryReader reader = new BinaryReader(zip)) {
            return Encoding.UTF8.GetString(reader.ReadBytes(10000));
         }
      }
   }
}

答案 2 :(得分:0)

取决于消息的来源。如果它们都是你的,那么你就有了一个静态字典,你的查询字符串只需要几个字符。

我猜这个消息可以是任何东西,并且是用户生成的,在这种情况下,动态学习方法最甜蜜:跟踪用户放在那里的内容并随着你的进展调整你的压缩字典。使用一些不常见但URL安全的字符作为转义字符,以显示即将出现的字典键。

你可以通过从互联网上获取一些单词列表来播种它。 quick google应该找到最常见的100或1000个英语单词。