高分求 C# 长字符串 压缩/解压缩 算法

q107770540 2017-09-22 08:02:48
现有一随机字符串,长度在2000左右:

string sample = "MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQC9rGtAXTfglq2acKsGYDs+zLoW7LJbiU8D2cfrOzXFrgEX8AtwuyFOUiKsj7HwhbfcjRIdiMKR7sv1l0bzOxAlaGVDEnoSJ3tyDhnvC9Uqeh5vLc0s9LG+8/e6cUhdeTY0RUt23fGFgK8OIZ2eYkmNqTtoIV21C8xDBmjMYNS21jHgdw9KWQIqEyeBTXNeIVcZuP4r/gbtplhfnpCe7mqHmGZTygxn4r/fDPQ3IGx/sNmTu5i1npdw4fP2xZCjCkSTz106EmRM9TXypzIvDHi8ycFM/uByKyUuKkdq8fIQOijAgMg4VSXmaAzrvu2yJPIBYm1fYBwQCK090+ivf2avAgMBAAECggEAf0dWaUikmHdEY+C7Q3oMB6ZGMeAAB+DqPwFDYJzJBrAvV6rjYnCQdwgy8G000NxKdxvLTjpZpqgCAfnTyKCXwyJ84Tdi5w/LjMvdp0Xfc7Oi/KRVjJdfN25rjJc8Ik2WjBj7/PYOfrHNxsPUC1aVWRR5IvVQ9o7GMSv54zwPQejsdxJKteZ0bUhPOzgcNMfd6051nXLFRdLSYiiWRqGlEAD1lbZqOmCzF7QJz9OJh7wM2jtMF7ihw3REVFT/B3sE1pMGmb/3P3bLLhxDxKJnlPiO0sZ2/Gp4S9kmoBgPmYnBPKbXbVTfxZg07UCPc97Bc1rJuJOw1hdyrkeaotcMAQKBgQD5BrBrus0fOAnSoLv79O5GL3OxXo4+SZzAaB6/rC6wZvtFFkqm/3eJaDywfWjpMpPZ1VSxqd0kCEfK+jSqNK2+H9RNEm+oOAC3cbjWw4zBwt0Y4DxaEo6fMo1+gokgkns9oKexhgwTacFyUrvEKAWDTl2qAcpvb5k5DIiNWJeRAQKBgQDC/DiDK8oWuz55omQil6m7FQTDE3NUlogwhTDPT61kdGER+TFk0jey/JBi/0VjZ+eF5R98yx0xuQ+nf6wudWGiX5WbNF5yjZpPXu1wJkAK2abIX/ggfNMn73kNW01bL4aT0TpV2rGW3hKd9ydvadZ5jJYcDDuFSf2QxpSXqqxHrwKBgQDF7jUnS1BiMe5MxYjk2GbSzkCMh/VTOLsoixl1i2uItjGdVfx8A62FP56NQQCz6YluqIsqszKbwyEdCgX2CuzVowLhR3gMIocfR3p86OzlzPZjIUeW6A0IJ+wi06oeg48FCr5+8WaDv5kMPwoS/SR0m0MDL20xaWhF2dpnTjUaAQKBgQC5Q+l2SN8lphgAfpnifHRbO+dga1TD5JvWblcoQ66eqi2pZDrYbx1ZRbzzM1V81DcZ89BtRJiirBIBtr+lDQcNvwBpjeLHuWALVkkIrG9hX9imvvkF9VS0t0cvt7bSk1+th7mD5d2jWbIawcGIjOmqaDggwkazqM/zBZweV56GJQKBgQCEFPU4tshsObee1IngYqcBlOygw0LmBUhbImayzOoUpw/NhNKQHKPyxpa4ylOdlwpXHis4MyjoqwxnZE+znrNYN8kyVP4GbZ6c2YnY4+YYu/IpRythNuivaIh+ZkJgZqLYZ+5h0MYwoQGem1/pJPdaeaaIDRsbYlhwiGwW2IXmvQ==";


需要一算法,将此字符串长度压缩到1000内,并且可以再解锁回原字符串

尝试过 GZipStream 等.NET framework自带的类,没有达到目标,反而长度越压缩越长...
尝试换不同的Encoding也不行,反而长度越压缩越长...

以下是没达到要求的代码:

 public static class Extensions
{
static System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();

/// <summary>
/// Compresses a string and returns a deflate compressed, Base64 encoded string.
/// </summary>
/// <param name="uncompressedString">String to compress</param>
public static string Compress(this string uncompressedString)
{
var compressedStream = new MemoryStream();
var uncompressedStream = new MemoryStream(encoding.GetBytes(uncompressedString));

using (var compressorStream = new GZipStream(compressedStream, CompressionMode.Compress, true))
{
uncompressedStream.CopyTo(compressorStream);
}

return Convert.ToBase64String(compressedStream.ToArray());
}

/// <summary>
/// Decompresses a deflate compressed, Base64 encoded string and returns an uncompressed string.
/// </summary>
/// <param name="compressedString">String to decompress.</param>
public static string Decompress(this string compressedString)
{
var decompressedStream = new MemoryStream();
var compressedStream = new MemoryStream(Convert.FromBase64String(compressedString));

using (var decompressorStream = new GZipStream(compressedStream, CompressionMode.Decompress, false))
{
decompressorStream.CopyTo(decompressedStream);
}

return encoding.GetString(decompressedStream.ToArray());
}
}
...全文
3512 34 打赏 收藏 转发到动态 举报
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
q107770540 2017-09-26
  • 打赏
  • 举报
回复
谢谢各位的积极回复,受限回复次数,就不一一回复了 压缩字符串的方案已放弃,无损压缩无法达到要求,已换其他思路去了
q107770540 2017-09-26
  • 打赏
  • 举报
回复
引用 28 楼 xuzuning 的回复:
一个 base64 编码串,有必要再压缩吗?即便要压缩,也是针对原始数据进行的
从第三方拿到的就是编码后的字符,不知道原始数据。。。不过谢谢回复
q107770540 2017-09-26
  • 打赏
  • 举报
回复
引用 2 楼 diaodiaop 的回复:
string写入txt. txt压缩rar. 把rar转换成byte [] 你看这个办法如何 然后把byte[]转成rar文件 在解压出来..
受限于权限,此方式很难实现
  • 打赏
  • 举报
回复
引用 18 楼 ilikeff8 的回复:
你的数据量太少,重复度也不高,用哈夫曼编码不是很理想

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication7
{
    class Program
    {
        static void Main(string[] args)
        {

            string sample = "MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQC9rGtAXTfglq2acKsGYDs+zLoW7LJbiU8D2cfrOzXFrgEX8AtwuyFOUiKsj7HwhbfcjRIdiMKR7sv1l0bzOxAlaGVDEnoSJ3tyDhnvC9Uqeh5vLc0s9LG+8/e6cUhdeTY0RUt23fGFgK8OIZ2eYkmNqTtoIV21C8xDBmjMYNS21jHgdw9KWQIqEyeBTXNeIVcZuP4r/gbtplhfnpCe7mqHmGZTygxn4r/fDPQ3IGx/sNmTu5i1npdw4fP2xZCjCkSTz106EmRM9TXypzIvDHi8ycFM/uByKyUuKkdq8fIQOijAgMg4VSXmaAzrvu2yJPIBYm1fYBwQCK090+ivf2avAgMBAAECggEAf0dWaUikmHdEY+C7Q3oMB6ZGMeAAB+DqPwFDYJzJBrAvV6rjYnCQdwgy8G000NxKdxvLTjpZpqgCAfnTyKCXwyJ84Tdi5w/LjMvdp0Xfc7Oi/KRVjJdfN25rjJc8Ik2WjBj7/PYOfrHNxsPUC1aVWRR5IvVQ9o7GMSv54zwPQejsdxJKteZ0bUhPOzgcNMfd6051nXLFRdLSYiiWRqGlEAD1lbZqOmCzF7QJz9OJh7wM2jtMF7ihw3REVFT/B3sE1pMGmb/3P3bLLhxDxKJnlPiO0sZ2/Gp4S9kmoBgPmYnBPKbXbVTfxZg07UCPc97Bc1rJuJOw1hdyrkeaotcMAQKBgQD5BrBrus0fOAnSoLv79O5GL3OxXo4+SZzAaB6/rC6wZvtFFkqm/3eJaDywfWjpMpPZ1VSxqd0kCEfK+jSqNK2+H9RNEm+oOAC3cbjWw4zBwt0Y4DxaEo6fMo1+gokgkns9oKexhgwTacFyUrvEKAWDTl2qAcpvb5k5DIiNWJeRAQKBgQDC/DiDK8oWuz55omQil6m7FQTDE3NUlogwhTDPT61kdGER+TFk0jey/JBi/0VjZ+eF5R98yx0xuQ+nf6wudWGiX5WbNF5yjZpPXu1wJkAK2abIX/ggfNMn73kNW01bL4aT0TpV2rGW3hKd9ydvadZ5jJYcDDuFSf2QxpSXqqxHrwKBgQDF7jUnS1BiMe5MxYjk2GbSzkCMh/VTOLsoixl1i2uItjGdVfx8A62FP56NQQCz6YluqIsqszKbwyEdCgX2CuzVowLhR3gMIocfR3p86OzlzPZjIUeW6A0IJ+wi06oeg48FCr5+8WaDv5kMPwoS/SR0m0MDL20xaWhF2dpnTjUaAQKBgQC5Q+l2SN8lphgAfpnifHRbO+dga1TD5JvWblcoQ66eqi2pZDrYbx1ZRbzzM1V81DcZ89BtRJiirBIBtr+lDQcNvwBpjeLHuWALVkkIrG9hX9imvvkF9VS0t0cvt7bSk1+th7mD5d2jWbIawcGIjOmqaDggwkazqM/zBZweV56GJQKBgQCEFPU4tshsObee1IngYqcBlOygw0LmBUhbImayzOoUpw/NhNKQHKPyxpa4ylOdlwpXHis4MyjoqwxnZE+znrNYN8kyVP4GbZ6c2YnY4+YYu/IpRythNuivaIh+ZkJgZqLYZ+5h0MYwoQGem1/pJPdaeaaIDRsbYlhwiGwW2IXmvQ==";

            // 生成编码表
            var nodeList = (from d in sample
                            group d by d into g
                            select new Node
                            {
                                key = g.Key,
                                weight = g.Count()
                            }).ToList();

            // 生成哈夫曼二叉树
            while (nodeList.Count(p => p.parent == null) > 1)
            {
                var twoNodeList = nodeList.Where(p => p.parent == null).OrderBy(p => p.weight).Take(2).ToList();

                Node newNode = new Node
                {
                    weight = twoNodeList.Sum(p => p.weight),
                    left = twoNodeList.OrderBy(p => p.weight).First(),
                    right = twoNodeList.OrderBy(p => p.weight).Last()
                };

                twoNodeList.ForEach(p => p.parent = newNode);
                nodeList.Add(newNode);
            }
            
            SetPath(nodeList.First(p => p.parent == null), string.Empty);
            nodeList = nodeList.Where(p => p.key != null).ToList();

            string bitList = string.Empty;
            foreach (var s in sample)
            {
                bitList += nodeList.First(p => p.key == s).path;
            }

            // 补位对齐
            int number = bitList.Length % 8;

            for (int i = 0; i < number; i++)
            {
                bitList += "0";
            }

            //压缩字节数组
            byte[] result = new byte[bitList.Length / 8];
            for (int i = 0; i < bitList.Count(); i += 8)
            {
                result[i/8] = Convert.ToByte(string.Join(string.Empty, bitList.Take(8)),2);
                bitList = bitList.Remove(0, 8);
            }

            // 编码结果表
            foreach(var node in nodeList)
            {
                Console.WriteLine(string.Format("{0}:{1}", node.key, node.path));
            }
            Console.WriteLine(string.Format("补齐位数:{0}", number));
            Console.WriteLine(string.Format("压缩字节数:{0}", result.Count()));

            Console.Read();
        }

        // 计算编码
        static void SetPath(Node node,string path)
        {
            node.path =path;

            if (node.left != null)
            {
                SetPath(node.left, path + "0");
            }
            if (node.right != null)
            {
                SetPath(node.right, path + "1");
            }
        }

        class Node
        {
            public Node parent;

            public char? key;
            public int weight;
            public string path=string.Empty;

            public Node left;
            public Node right;
        }
    }
}
没看懂 这样压缩完了 可以还原么
yiluoweishi 2017-09-25
  • 打赏
  • 举报
回复
表示已经看蒙。
threenewbee 2017-09-25
  • 打赏
  • 举报
回复
为什么不先base64解码成byte[]再压缩?
xuzuning 2017-09-25
  • 打赏
  • 举报
回复
一个 base64 编码串,有必要再压缩吗?即便要压缩,也是针对原始数据进行的
dy00544 2017-09-25
  • 打赏
  • 举报
回复
有这么好的算法么?我都想见识下。 感觉目前主流的压缩算法都是几十年前的,最多优化下。 没什么新的算法出来。
ilikeff8 2017-09-23
  • 打赏
  • 举报
回复
引用 17 楼 wawd74520 的回复:
不介意乱码的话。可以试试这个。压缩一半。
uncode编码一个字符是用2个字节,例如汉字, 而 tempstr = Unicode2String(tempstr); int das = tempstr.Length; 字符串的length是统计字符数,不是字节数,例如"中国".Length=2,但实际上使用4个字节
秋的红果实 2017-09-23
  • 打赏
  • 举报
回复
decompress,根据dictionary里的字符以及对应的位置值(如0|2|4),重新组装字符串
秋的红果实 2017-09-23
  • 打赏
  • 举报
回复
思路:用一个字符代替多个。样例中用'@', '#', '$', '%'中的一个代替某个字符(如A)的多个位置 缺陷:你要操作的原始字符串,由尽量少的字符组成,看例子说明 样例:(因时间有限,代码不完整,lz凑合着看思路吧)

/// <summary>
/// The method returns a string consisting of all the positions of the specified character in the original string,and between characters are separated by |
/// eg:ABCDACADABAACDDABCCA,to 'A',return:0|4|6|8|10|15|19
/// </summary>
/// <param name="inpuChar"></param>
/// <param name="targetString"></param>
/// <returns></returns>
private string getPosition(char inpuChar,string targetString)
{
    string result = string.Empty;
    int tempIndex=0;
    for(int i=0;i<targetString.Length;i++)
    {
        tempIndex=targetString.IndexOf(inpuChar,i);
        if(tempIndex!=-1)
        {
            result += result == string.Empty ? tempIndex.ToString() : "|" + tempIndex.ToString();
            i = tempIndex + 1;
        }
    }

    return result;
}

//---------------------------------------------------------
string origString = "ABCDACADABAACDDABCCA";
string compressString = string.Empty;

char[] distinctString = origString.Distinct().ToArray();
char[] flag = new char[] { '@', '#', '$', '%' };
Dictionary<char, string> corRespondence = new Dictionary<char, string>();
for(int j=0;j<distinctString.Length;j++)
{
    corRespondence.Add(distinctString[j], getPosition(distinctString[j], origString));
    compressString += distinctString[j].ToString() + flag[j];

}

listBox1.Items.Add(compressString); 

//output A@B#C$D%
ilikeff8 2017-09-23
  • 打赏
  • 举报
回复
你的数据量太少,重复度也不高,用哈夫曼编码不是很理想


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication7
{
class Program
{
static void Main(string[] args)
{

string sample = "MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQC9rGtAXTfglq2acKsGYDs+zLoW7LJbiU8D2cfrOzXFrgEX8AtwuyFOUiKsj7HwhbfcjRIdiMKR7sv1l0bzOxAlaGVDEnoSJ3tyDhnvC9Uqeh5vLc0s9LG+8/e6cUhdeTY0RUt23fGFgK8OIZ2eYkmNqTtoIV21C8xDBmjMYNS21jHgdw9KWQIqEyeBTXNeIVcZuP4r/gbtplhfnpCe7mqHmGZTygxn4r/fDPQ3IGx/sNmTu5i1npdw4fP2xZCjCkSTz106EmRM9TXypzIvDHi8ycFM/uByKyUuKkdq8fIQOijAgMg4VSXmaAzrvu2yJPIBYm1fYBwQCK090+ivf2avAgMBAAECggEAf0dWaUikmHdEY+C7Q3oMB6ZGMeAAB+DqPwFDYJzJBrAvV6rjYnCQdwgy8G000NxKdxvLTjpZpqgCAfnTyKCXwyJ84Tdi5w/LjMvdp0Xfc7Oi/KRVjJdfN25rjJc8Ik2WjBj7/PYOfrHNxsPUC1aVWRR5IvVQ9o7GMSv54zwPQejsdxJKteZ0bUhPOzgcNMfd6051nXLFRdLSYiiWRqGlEAD1lbZqOmCzF7QJz9OJh7wM2jtMF7ihw3REVFT/B3sE1pMGmb/3P3bLLhxDxKJnlPiO0sZ2/Gp4S9kmoBgPmYnBPKbXbVTfxZg07UCPc97Bc1rJuJOw1hdyrkeaotcMAQKBgQD5BrBrus0fOAnSoLv79O5GL3OxXo4+SZzAaB6/rC6wZvtFFkqm/3eJaDywfWjpMpPZ1VSxqd0kCEfK+jSqNK2+H9RNEm+oOAC3cbjWw4zBwt0Y4DxaEo6fMo1+gokgkns9oKexhgwTacFyUrvEKAWDTl2qAcpvb5k5DIiNWJeRAQKBgQDC/DiDK8oWuz55omQil6m7FQTDE3NUlogwhTDPT61kdGER+TFk0jey/JBi/0VjZ+eF5R98yx0xuQ+nf6wudWGiX5WbNF5yjZpPXu1wJkAK2abIX/ggfNMn73kNW01bL4aT0TpV2rGW3hKd9ydvadZ5jJYcDDuFSf2QxpSXqqxHrwKBgQDF7jUnS1BiMe5MxYjk2GbSzkCMh/VTOLsoixl1i2uItjGdVfx8A62FP56NQQCz6YluqIsqszKbwyEdCgX2CuzVowLhR3gMIocfR3p86OzlzPZjIUeW6A0IJ+wi06oeg48FCr5+8WaDv5kMPwoS/SR0m0MDL20xaWhF2dpnTjUaAQKBgQC5Q+l2SN8lphgAfpnifHRbO+dga1TD5JvWblcoQ66eqi2pZDrYbx1ZRbzzM1V81DcZ89BtRJiirBIBtr+lDQcNvwBpjeLHuWALVkkIrG9hX9imvvkF9VS0t0cvt7bSk1+th7mD5d2jWbIawcGIjOmqaDggwkazqM/zBZweV56GJQKBgQCEFPU4tshsObee1IngYqcBlOygw0LmBUhbImayzOoUpw/NhNKQHKPyxpa4ylOdlwpXHis4MyjoqwxnZE+znrNYN8kyVP4GbZ6c2YnY4+YYu/IpRythNuivaIh+ZkJgZqLYZ+5h0MYwoQGem1/pJPdaeaaIDRsbYlhwiGwW2IXmvQ==";

// 生成编码表
var nodeList = (from d in sample
group d by d into g
select new Node
{
key = g.Key,
weight = g.Count()
}).ToList();

// 生成哈夫曼二叉树
while (nodeList.Count(p => p.parent == null) > 1)
{
var twoNodeList = nodeList.Where(p => p.parent == null).OrderBy(p => p.weight).Take(2).ToList();

Node newNode = new Node
{
weight = twoNodeList.Sum(p => p.weight),
left = twoNodeList.OrderBy(p => p.weight).First(),
right = twoNodeList.OrderBy(p => p.weight).Last()
};

twoNodeList.ForEach(p => p.parent = newNode);
nodeList.Add(newNode);
}

SetPath(nodeList.First(p => p.parent == null), string.Empty);
nodeList = nodeList.Where(p => p.key != null).ToList();

string bitList = string.Empty;
foreach (var s in sample)
{
bitList += nodeList.First(p => p.key == s).path;
}

// 补位对齐
int number = bitList.Length % 8;

for (int i = 0; i < number; i++)
{
bitList += "0";
}

//压缩字节数组
byte[] result = new byte[bitList.Length / 8];
for (int i = 0; i < bitList.Count(); i += 8)
{
result[i/8] = Convert.ToByte(string.Join(string.Empty, bitList.Take(8)),2);
bitList = bitList.Remove(0, 8);
}

// 编码结果表
foreach(var node in nodeList)
{
Console.WriteLine(string.Format("{0}:{1}", node.key, node.path));
}
Console.WriteLine(string.Format("补齐位数:{0}", number));
Console.WriteLine(string.Format("压缩字节数:{0}", result.Count()));

Console.Read();
}

// 计算编码
static void SetPath(Node node,string path)
{
node.path =path;

if (node.left != null)
{
SetPath(node.left, path + "0");
}
if (node.right != null)
{
SetPath(node.right, path + "1");
}
}

class Node
{
public Node parent;

public char? key;
public int weight;
public string path=string.Empty;

public Node left;
public Node right;
}
}
}


失落的神庙 2017-09-23
  • 打赏
  • 举报
回复
我还有一个想法。 这个字符可以看成是64进制 需要2进制 6位才能表示 而我们可以存256那么理论上是2进制可以有8位 那我们理论上可以压缩1/4但是感觉还是达不到目的
失落的神庙 2017-09-23
  • 打赏
  • 举报
回复
引用 19 楼 ilikeff8 的回复:
uncode编码一个字符是用2个字节,例如汉字, 而 tempstr = Unicode2String(tempstr); int das = tempstr.Length; 字符串的length是统计字符数,不是字节数,例如"中国".Length=2,但实际上使用4个字节
嗯啊。感觉这个就想压缩算法一样。想再压缩一点。太难了。
足球中国 2017-09-23
  • 打赏
  • 举报
回复
有没有这样一个前提就是只有字符串和数字,而没有中文,符号等
kxyzjm62 2017-09-23
  • 打赏
  • 举报
回复
楼主的问题似乎无解,压缩分有损压缩和无损压缩。按照楼主的要求,应该是无损压缩,也就是说,经过压缩的文件使用一定的技术手段(方法)可以完整复现原始文件的信息。压缩的核心是使用简单的信息(符号)根据约定(文件头信息、内置对应表等)表达复杂的信息。如果一个待压缩的文件长度很小或文件中重复内容不能用跟简单的信息进行标示(内容和位置),那么无论采用什么算法,压缩的最好结果就是得到的文件大小大于等于源文件。
秋的红果实 2017-09-23
  • 打赏
  • 举报
回复
lz,我的思路再升级下,应该可以使用 在我上面思路基础上,不用'@', '#', '$', '%'这些字符,用位置替代,例如: 原始串ABCDACADABAACDDABCCA,压缩后的串就是ABCD! 拿A来讲,在原始串中位置是0|4|6|8|10|15|19,压缩后的串中处在字符串的0位置,那么,你让dictionary中key=0的位置值等于0|4|6|8|10|15|19 拿B来讲,在原始串中位置是1|9|16,压缩后的串中处在字符串的1位置,那么,你让dictionary中key=1的位置值等于1|9|16 …… 解压时,遍历压缩后的字符串,根据当前char在字符串中的位置i,在dictionary中查找i对应的位置信息(如1|9|16),重新组装字符串
X-i-n 2017-09-22
  • 打赏
  • 举报
回复
小文件就是这样了,而且就算能找到算法把现在这串压进1000,也不能保证这个算法能把所有的随机字符串都压进1000。 这样的算法我正好有一个,可以把你这个串压进10Byte

        string compress(string plaintext)
        {
            string key1 = "MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQC9rGtAXTfglq2acKsGYDs+zLoW7LJbiU8D2cfrOzXFrgEX8AtwuyFOUiKsj7HwhbfcjRIdiMKR7sv1l0bzOxAlaGVDEnoSJ3tyDhnvC9Uqeh5vLc0s9LG+8/e6cUhdeTY0RUt23fGFgK8OIZ2eYkmNqTtoIV21C8xDBmjMYNS21jHgdw9KWQIqEyeBTXNeIVcZuP4r/gbtplhfnpCe7mqHmGZTygxn4r/fDPQ3IGx/sNmTu5i1npdw4fP2xZCjCkSTz106EmRM9TXypzIvDHi8ycFM/uByKyUuKkdq8fIQOijAgMg4VSXmaAzrvu2yJPIBYm1fYBwQCK090+ivf2avAgMBAAECggEAf0dWaUikmHdEY+C7Q3oMB6ZGMeAAB+DqPwFDYJzJBrAvV6rjYnCQdwgy8G000NxKdxvLTjpZpqgCAfnTyKCXwyJ84Tdi5w/LjMvdp0Xfc7Oi/KRVjJdfN25rjJc8Ik2WjBj7/PYOfrHNxsPUC1aVWRR5IvVQ9o7GMSv54zwPQejsdxJKteZ0bUhPOzgcNMfd6051nXLFRdLSYiiWRqGlEAD1lbZqOmCzF7QJz9OJh7wM2jtMF7ihw3REVFT/B3sE1pMGmb/3P3bLLhxDxKJnlPiO0sZ2/Gp4S9kmoBgPmYnBPKbXbVTfxZg07UCPc97Bc1rJuJOw1hdyrkeaotcMAQKBgQD5BrBrus0fOAnSoLv79O5GL3OxXo4+SZzAaB6/rC6wZvtFFkqm/3eJaDywfWjpMpPZ1VSxqd0kCEfK+jSqNK2+H9RNEm+oOAC3cbjWw4zBwt0Y4DxaEo6fMo1+gokgkns9oKexhgwTacFyUrvEKAWDTl2qAcpvb5k5DIiNWJeRAQKBgQDC/DiDK8oWuz55omQil6m7FQTDE3NUlogwhTDPT61kdGER+TFk0jey/JBi/0VjZ+eF5R98yx0xuQ+nf6wudWGiX5WbNF5yjZpPXu1wJkAK2abIX/ggfNMn73kNW01bL4aT0TpV2rGW3hKd9ydvadZ5jJYcDDuFSf2QxpSXqqxHrwKBgQDF7jUnS1BiMe5MxYjk2GbSzkCMh/VTOLsoixl1i2uItjGdVfx8A62FP56NQQCz6YluqIsqszKbwyEdCgX2CuzVowLhR3gMIocfR3p86OzlzPZjIUeW6A0IJ+wi06oeg48FCr5+8WaDv5kMPwoS/SR0m0MDL20xaWhF2dpnTjUaAQKBgQC5Q+l2SN8lphgAfpnifHRbO+dga1TD5JvWblcoQ66eqi2pZDrYbx1ZRbzzM1V81DcZ89BtRJiirBIBtr+lDQcNvwBpjeLHuWALVkkIrG9hX9imvvkF9VS0t0cvt7bSk1+th7mD5d2jWbIawcGIjOmqaDggwkazqM/zBZweV56GJQKBgQCEFPU4tshsObee1IngYqcBlOygw0LmBUhbImayzOoUpw/NhNKQHKPyxpa4ylOdlwpXHis4MyjoqwxnZE+znrNYN8kyVP4GbZ6c2YnY4+YYu/IpRythNuivaIh+ZkJgZqLYZ+5h0MYwoQGem1/pJPdaeaaIDRsbYlhwiGwW2IXmvQ==";
            return plaintext.Replace(key1, "*key1*");
        }
        string decompress(string encoded)
        {
            string key1 = "MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQC9rGtAXTfglq2acKsGYDs+zLoW7LJbiU8D2cfrOzXFrgEX8AtwuyFOUiKsj7HwhbfcjRIdiMKR7sv1l0bzOxAlaGVDEnoSJ3tyDhnvC9Uqeh5vLc0s9LG+8/e6cUhdeTY0RUt23fGFgK8OIZ2eYkmNqTtoIV21C8xDBmjMYNS21jHgdw9KWQIqEyeBTXNeIVcZuP4r/gbtplhfnpCe7mqHmGZTygxn4r/fDPQ3IGx/sNmTu5i1npdw4fP2xZCjCkSTz106EmRM9TXypzIvDHi8ycFM/uByKyUuKkdq8fIQOijAgMg4VSXmaAzrvu2yJPIBYm1fYBwQCK090+ivf2avAgMBAAECggEAf0dWaUikmHdEY+C7Q3oMB6ZGMeAAB+DqPwFDYJzJBrAvV6rjYnCQdwgy8G000NxKdxvLTjpZpqgCAfnTyKCXwyJ84Tdi5w/LjMvdp0Xfc7Oi/KRVjJdfN25rjJc8Ik2WjBj7/PYOfrHNxsPUC1aVWRR5IvVQ9o7GMSv54zwPQejsdxJKteZ0bUhPOzgcNMfd6051nXLFRdLSYiiWRqGlEAD1lbZqOmCzF7QJz9OJh7wM2jtMF7ihw3REVFT/B3sE1pMGmb/3P3bLLhxDxKJnlPiO0sZ2/Gp4S9kmoBgPmYnBPKbXbVTfxZg07UCPc97Bc1rJuJOw1hdyrkeaotcMAQKBgQD5BrBrus0fOAnSoLv79O5GL3OxXo4+SZzAaB6/rC6wZvtFFkqm/3eJaDywfWjpMpPZ1VSxqd0kCEfK+jSqNK2+H9RNEm+oOAC3cbjWw4zBwt0Y4DxaEo6fMo1+gokgkns9oKexhgwTacFyUrvEKAWDTl2qAcpvb5k5DIiNWJeRAQKBgQDC/DiDK8oWuz55omQil6m7FQTDE3NUlogwhTDPT61kdGER+TFk0jey/JBi/0VjZ+eF5R98yx0xuQ+nf6wudWGiX5WbNF5yjZpPXu1wJkAK2abIX/ggfNMn73kNW01bL4aT0TpV2rGW3hKd9ydvadZ5jJYcDDuFSf2QxpSXqqxHrwKBgQDF7jUnS1BiMe5MxYjk2GbSzkCMh/VTOLsoixl1i2uItjGdVfx8A62FP56NQQCz6YluqIsqszKbwyEdCgX2CuzVowLhR3gMIocfR3p86OzlzPZjIUeW6A0IJ+wi06oeg48FCr5+8WaDv5kMPwoS/SR0m0MDL20xaWhF2dpnTjUaAQKBgQC5Q+l2SN8lphgAfpnifHRbO+dga1TD5JvWblcoQ66eqi2pZDrYbx1ZRbzzM1V81DcZ89BtRJiirBIBtr+lDQcNvwBpjeLHuWALVkkIrG9hX9imvvkF9VS0t0cvt7bSk1+th7mD5d2jWbIawcGIjOmqaDggwkazqM/zBZweV56GJQKBgQCEFPU4tshsObee1IngYqcBlOygw0LmBUhbImayzOoUpw/NhNKQHKPyxpa4ylOdlwpXHis4MyjoqwxnZE+znrNYN8kyVP4GbZ6c2YnY4+YYu/IpRythNuivaIh+ZkJgZqLYZ+5h0MYwoQGem1/pJPdaeaaIDRsbYlhwiGwW2IXmvQ==";
            return encoded.Replace("*key1*", key1);
        }
by_封爱 版主 2017-09-22
  • 打赏
  • 举报
回复
引用 9 楼 kongwei521 的回复:
经过测试可从你发的字符串 1628压缩到 908 但是解压的时候会报data error
所以... 这不都是假的吗? 哈哈. 那我随便输入几百万数据 我都可以给你压成1 . 反正无解.. 或者 我在给你MD5加密 压成32位. 反正也无解..
蝶恋花雨 2017-09-22
  • 打赏
  • 举报
回复
可用 SevenZip 来压缩,https://sevenzipsharp.codeplex.com using Encoder = SevenZip.Sdk.Compression.Lzma.Encoder; using Decoder = SevenZip.Sdk.Compression.Lzma.Decoder;
  MessageBox.Show(sourceStr.Length.ToString());

            var yStr = CompressString(sourceStr);
            MessageBox.Show(yStr.Length.ToString());


            var jStr = DecompressString(yStr);
            MessageBox.Show(jStr.Length.ToString());
            MessageBox.Show(jStr);
public static string CompressString(string text)
        {
            string result = null;

            using (var t = new MemoryStream(Encoding.Default.GetBytes(text)))
            using (var m = new MemoryStream()) {

                var encoder = new Encoder();

                encoder.WriteCoderProperties(m);
                m.Write(BitConverter.GetBytes(t.Length), 0, 8);
                encoder.Code(t, m, t.Length, -1, null);

                m.Position = 0;
                result = Encoding.Default.GetString(m.ToArray());

                t.Close();
                m.Close();
            }
           MessageBox.Show($"{watcher.TotalMilliseconds()}ms in compress  {text.Length} chars with SevenZip! = {result.Length} new length");
         
            return result;
        }
public static string DecompressString(string text)
        {
            string result = null;
            using (var t = new MemoryStream(Encoding.Default.GetBytes(text)))
            using (var m = new MemoryStream())
            {
                var decoder = new Decoder();

                var numArray = new byte[5];
                t.Read(numArray, 0, 5);
                var numArray1 = new byte[8];
                t.Read(numArray1, 0, 8);

                var num = BitConverter.ToInt64(numArray1, 0);

                decoder.SetDecoderProperties(numArray);
                decoder.Code(t, m, t.Length, num, null);

                m.Position = 0;
                result = new StreamReader(m).ReadToEnd();

                t.Close();
                m.Close();
            }

         MessageBox.Show($"{watcher.TotalMilliseconds()} ms in decompress {text.Length} chars with SevenZip! = {result.Length} new length");

            return result;
        }
经过测试可从你发的字符串 1628压缩到 908 但是解压的时候会报data error
加载更多回复(14)

110,477

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧