在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 的符号,该符号不能出现在前面的数据中。
所以我正在尝试创建一种自适应霍夫曼编码算法,但我 运行 遇到了一些障碍,我不确定如何解决。
除了一个小问题外,我的算法完全按预期运行;我似乎无法弄清楚如何确保当压缩结果不是每个字节都正好是 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 的符号,该符号不能出现在前面的数据中。