110,477
社区成员
发帖
与我相关
我的任务
分享
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==";
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());
}
}
/// <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%
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;
}
}
}
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);
}
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