【发布时间】:2021-03-02 02:13:43
【问题描述】:
所以我正在尝试创建一种自适应霍夫曼编码算法,但我遇到了一些我不知道如何解决的障碍。
我的算法完全按预期工作,除了一个小问题;当压缩结果不是每个字节正好有 8 位时,我似乎无法弄清楚如何确保不写入额外的字符。
举个例子;这是我输入文本的结尾片段
subscribe to our email newsletter to hear about new eBooks.
fa
这是相同文本在编码然后解码后的结尾片段
subscribe to our email newsletter to hear about new eBooks.
fa
as
额外的“as”字符是最终压缩位不是完整字节的一部分的结果;最后一个字节由“0111”位表示,程序在内部将其识别为“00000111”,这导致最后两个字符被写入。除此之外,当我尝试对这个字节的末尾应用填充,导致它被视为“01110000”时,结尾片段如下所示。
subscribe to our email newsletter to hear about new eBooks.
fa
r
这稍微好一点,但是额外的“r”字符被写入,因为这种编码的“r”代码是“0000”,导致了这种复杂性。
如何避免这种情况?
如果这意味着什么,为了获得这些位,我正在使用以下代码块处理一个包含 1 和 0 序列的编码字符串。
split 是一个字符串数组,其中字符串被拆分为 8 个字符,而 list 是一个 ArrayList,其中包含一个整数列表,这些整数存储以后将输出为二进制表示形式的字符串。
String[] split = frankenstein.encodedString.split("(?<=\\G.{8})");
for (int i = 0; i < split.length; i++) {
String str = split[i];
//Adds 0 padding at the end of the bits if it's necessary
if (i == split.length - 1) {
if (str.length() != 8) {
for (int j = str.length(); j < 8 ;j++)
str += "0";
}
}
list.add(Integer.parseInt(str, 2));
}
【问题讨论】:
标签: java encoding binary compression huffman-code