在最小字节数组中对共享给定(非标准)字符集上的给定字符串进行编码/解码

时间:2015-06-26 14:24:14

标签: c# string encoding compression text-compression

我正在寻找一种通用算法,它对设置为/从字节数组的已定义字符的给定字符串进行编码/解码。它必须使用最小的空间。

我开始开发我的基础2算法的一种Base'n',但我认为必须已经开发了类似的东西。

我需要使用已知的受限字符集对最小位数字符串进行编码。也许我应该使用bzip2?

编辑:我的字符串长度最大为160个字符。如果需要,我可以填写它们。

Edit2:我必须知道最坏情况的位数。

byte[] encode(string charset, string value)

string decode(string charset, byte[] encodedValue)

用法:

string myString = "HELLO WORLD";
string charSet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ "; // Base 27
byte[] encodedString = encode(charset, myString); // Base 27 -> Base 2
Debug.Assert(myString.Equals(decode(charset, encodedString))); // Base 2 -> Base 27

1 个答案:

答案 0 :(得分:2)

您可以使用简单,快速的前缀代码,每个字符使用 k k-1 位。那么最坏的情况是 m 字符的 m k 位。

对于base n ,让 k = ceiling(log 2 n ))。将符号从0转换为 n-1 。如果符号的索引 x 小于 2 k -n ,则将 x 作为 k-1 位整数。否则,将 2 k -n + x 作为 k 位整数发出。

这比分别需要乘法/除法的基本编码/解码快得多。让我们看一下极端情况,其中基本编码恰好尽可能地适合64位。 (除了基数为例如2,4,16或256的普通情况。)最好的情况是有138个符号,其中9个这样的符号恰好适合64位,你可以使用机器64位无符号整数的乘法和除法指令。 138 9 = 18151468971815029248,其为2 64 = 18446744073709551616的98.4%。使用基本编码,每个符号有7.111位。使用上述前缀编码,每个符号平均有7.145位。

上述前缀编码是所有字符具有相同概率的情况下的最佳霍夫曼代码。如果情况并非如此,并且您希望实现某些压缩,那么您可以查看数据的大样本并为字符生成固定的霍夫曼代码,或者您可以单独为霍夫曼编码每条消息。在后一种情况下,您将需要为每条消息传输消息唯一的霍夫曼代码的开销,这需要一定的可压缩性和长消息来实现增益。