【问题标题】:Encode/Decode a given string on a shared given (non standard) charset in a minimal byte array在最小字节数组中对共享给定(非标准)字符集上的给定字符串进行编码/解码
【发布时间】:2015-06-26 14:24:13
【问题描述】:

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

我开始开发我的,这是一种从 Base'n' 到 Base 2 的算法,但我认为类似的东西一定已经开发出来了。

我需要使用已知的受限字符集以最小位数编码字符串。也许我应该使用 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

【问题讨论】:

  • 查找霍夫曼编码
  • Here 有一个 base-n 转换器。执行Encoding.UTF8.GetBytes(myString) 并将结果传递给那里编写的方法。

标签: c# string encoding compression text-compression


【解决方案1】:

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

对于基数n,令k = 上限(log2(n))。索引从 0 到 n-1 的符号。如果符号的索引 x 小于 2k-n,则发出 x 作为k-1 位整数。否则,发出 2k-n+x 作为 k 位整数。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-18
    • 1970-01-01
    • 1970-01-01
    • 2016-02-17
    • 1970-01-01
    • 2014-04-27
    相关资源
    最近更新 更多