Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 非常简单的短字符串压缩_C#_String_Compression_Short - Fatal编程技术网

C# 非常简单的短字符串压缩

C# 非常简单的短字符串压缩,c#,string,compression,short,C#,String,Compression,Short,对于长度不超过255个字符的字符串,是否有一种真正简单的压缩技术(是的,我正在压缩) 我不关心压缩的强度-我在寻找性能非常好并且能够快速实现的东西。我想要比以下更简单的东西:一些可以用几个简单方法实现的东西。你的目标是什么 短网址?尝试URL缩写,如或 存储空间?查看System.IO.Compression。(或) 我将首先尝试一个现有的(免费或开源)zip库,例如 Zip应该可以很好地用于文本字符串,我不确定是否值得您自己实现一个压缩算法……我建议您查看一下。有一些可能会有帮助。您尝试过使

对于长度不超过255个字符的字符串,是否有一种真正简单的压缩技术(是的,我正在压缩)

我不关心压缩的强度-我在寻找性能非常好并且能够快速实现的东西。我想要比以下更简单的东西:一些可以用几个简单方法实现的东西。

你的目标是什么

  • 短网址?尝试URL缩写,如或
  • 存储空间?查看System.IO.Compression。(或)

我将首先尝试一个现有的(免费或开源)zip库,例如


Zip应该可以很好地用于文本字符串,我不确定是否值得您自己实现一个压缩算法……

我建议您查看一下。有一些可能会有帮助。

您尝试过使用吗


不知道它是否能有效地处理如此短的字符串,但我认为这可能是您最好的选择。

开源库易于使用,并将为您提供压缩工具

我认为这里的关键问题是“为什么要压缩URL?”

试图缩短地址栏的长URL?

您最好将原始URL存储在某个地方(数据库、文本文件…)以及非域部分的哈希代码(MD5可以)。然后,您可以使用一个简单的页面(或者一些HTTPModule,如果您觉得浮华的话)来阅读MD5并查找真正的URL。TinyURL和其他人就是这样工作的

例如:

http://mydomain.com/folder1/folder2/page1.aspx
可能短路到:

http://mydomain.com/2d4f1c8a
为此使用压缩库将不起作用。该字符串将被压缩为较短的二进制表示形式,但将其转换回需要作为URL一部分有效的字符串(例如Base64)将否定您从压缩中获得的任何好处

在内存或磁盘上存储大量URL?

使用System.IO.Compression中的内置压缩库或ZLib库,它简单且非常好。由于您将存储二进制数据,因此压缩输出将保持原样。您需要解压缩它才能将其用作URL。

如中所建议,使用数据压缩无法缩短已经相当短的URL路径

具有公开静态(在VB中共享)方法的DeflateStream类。这是一种使用DEFLATE()压缩字符串的单行方法。DEFLATE实现与完全兼容,但DotNetZip压缩效果更好。以下是您可以如何使用它:

string[] orig = {
    "folder1/folder2/page1.aspx",
    "folderBB/folderAA/page2.aspx",
};
public void Run()
{
    foreach (string s in orig)
    {
        System.Console.WriteLine("original    : {0}", s);
        byte[] compressed = DeflateStream.CompressString(s);
        System.Console.WriteLine("compressed  : {0}", ByteArrayToHexString(compressed));
        string uncompressed = DeflateStream.UncompressString(compressed);
        System.Console.WriteLine("uncompressed: {0}\n", uncompressed);
    }
}
使用该代码,以下是我的测试结果:

original    : folder1/folder2/page1.aspx
compressed  : 4bcbcf49492d32d44f03d346fa0589e9a9867a89c5051500
uncompressed: folder1/folder2/page1.aspx

original    : folderBB/folderAA/page2.aspx
compressed  : 4bcbcf49492d7272d24f03331c1df50b12d3538df4128b0b2a00
uncompressed: folderBB/folderAA/page2.aspx
因此,您可以看到“压缩”字节数组,当用十六进制表示时,比原始数组长约2倍。原因是一个十六进制字节实际上是2个ASCII字符

您可以使用base-62而不是base-16(十六进制)来表示数字,从而在一定程度上补偿这一点。在这种情况下,a-z和a-z也是数字,给你0-9(10)+a-z(+26)+a-z(+26)=62个总数字。这将大大缩短产量。我还没试过。然而


编辑

好的,我测试了Base-62编码器。它将十六进制字符串缩短约一半。我想它会将其削减到25%(62/16=~4),但我认为我在离散化方面失去了一些东西。在我的测试中,生成的base-62编码字符串与原始URL的长度大致相同。所以,不,使用压缩和base-62编码仍然不是一个好方法。您确实需要一个哈希值。

您可以直接使用deflate算法,而不需要任何页眉校验和或页脚,如本问题所述:

在我的测试中,这将4100个字符的URL减少到1270个base64字符,使其符合IE的2000限制


这里是一个无法用哈希表解决的示例,因为小程序可以存在于任何服务器上。

我刚刚创建了一个针对URL的压缩方案,实现了大约50%的压缩(与原始URL文本的base64表示法相比)


如果有一家大型科技公司的人能把这本书正确地制作出来,并发表出来供大家使用,那就太好了。谷歌支持协议缓冲区。这个工具可以为像谷歌这样的人节省大量的磁盘空间,同时仍然可以扫描。或者是伟大的船长本人


从技术上讲,我将其称为URL下数据的二进制(按位)序列化方案。将URL视为概念数据的文本表示,然后使用专门的序列化程序序列化该概念数据模型。结果当然是原版的压缩版本。这与通用压缩算法的工作原理非常不同。

与压缩强度无关-我正在寻找性能非常好且能够快速实现的算法。你能给我指一下base64吗?base64不会压缩任何东西:)@Jon Grant:正确。Base64是个愚蠢的建议。只有在实际压缩后才能工作,以获得(可能)更小但仍然是ascii的内容。已经清除了建议的所有痕迹。为什么?也许有更好的方法来满足你的要求。“为什么”当然是个好答案。然而,作为补充说明,Huffman编码对于简单的文本压缩非常有效,而不必求助于外部库和LZW压缩。可能的重复并不是问题的答案。如果你没有地方存储哈希表怎么办?@endolith-关键是字符串压缩在这里对你没有帮助,只是把它与哈希或类似的东西联系起来。请参阅Cheeso的答案,了解真实世界示例压缩的时间更长,并且在转换回有效URL时与原始压缩的时间一样长。您总是有“某处”来存储哈希。如果你真的“无处”存储它,请将其硬编码到你的URL重定向代码中!您并不总是有地方存储哈希表,也不总是使URL变长,对于instanceData,uri不是任何类型的压缩,并且