在Java中将霍夫曼编码的字符串写入文件时如何处理不均匀的字节数?

How to handle uneven number of bytes when writing a huffman-encoded string to a file in Java?

所以我正在尝试创建一种自适应霍夫曼编码算法,但我 运行 遇到了一些障碍,我不确定如何解决。

除了一个小问题外,我的算法完全按预期运行;我似乎无法弄清楚如何确保当压缩结果不是每个字节都正好是 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));
}

要么 a) 在编码消息之前发送要解码的字符数,要么 b) 在您编码的内容中包含一个唯一的流结束符号作为最后一个符号。后者的一个示例是,如果您正在对 0..255 范围内的字节进行编码,则在末尾添加一个值为 256 的符号,该符号不能出现在前面的数据中。