【问题标题】:How to handle uneven number of bytes when writing a huffman-encoded string to a file in Java?将霍夫曼编码的字符串写入Java文件时如何处理奇数字节?
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-30
      • 1970-01-01
      • 2012-03-10
      • 1970-01-01
      • 2016-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多