当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《为QueryString压缩大约1000个字节的文本》经验,为你挑选了2个好方法。

我想创建一个机制(在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的思路思考,这本身也是一种欺骗.希望这是一个通用的"短文本压缩"问题.



1> Jon Skeet..:

那么,眼前的问题是:

压缩的结果基本上是二进制的,所以你需要对它进行base64编码,这将使它再次变大1/3.(您也应该使用websafe base64编码.)

没有压缩算法总是会减小文本的大小

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

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

将字符串编码为字节

压缩

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

另一方面,反向应用相同的转换.

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



2> Guffa..:

您可以将字符串编码为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));
         }
      }
   }
}

推荐阅读
可爱的天使keven_464
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有