java - 当我在我的解压缩方法中运行我的压缩文件时添加了额外的字节
问题描述
我在这里处理文本文件。我的 LZW 解压似乎无法正常工作。当我尝试将压缩文件解压缩回来时出现问题:解压缩后我在文本文件中添加了额外的字节。截至目前,我发现了导致问题的值序列,它是 *(星号)
例如,当我有一个包含以下句子的文本文件时:
*** Hello ***
以下是我的减压工作方式(我只展示了 2 次迭代):
#1 iteration
priorword = 42
currword = 256
Added in dict: 256: **
Wrote in file: **
#2 iteration
priorword = 256
currword = 32
Added in dict: 257: **_ (_ means space)
Write in file: **
We know have in file: ****_
这里可能有什么问题,添加了一个额外的星,因为您可以看到原始文件有三颗星。
解压后,I get: **** Hello **
左边加了一个星*,怎么会这样?
解压方式:
public void LZW_Decompress(String input) throws IOException {
// DictSize builds up to 4k, Array_Char holds these values
Array_char = new String[4096];
for (int i = 0; i < 256; i++) {
dictionary.put(i, Character.toString((char) i));
Array_char[i] = Character.toString((char) i);
}
// Read input as uncompressed file & Write out compressed file
RandomAccessFile in = new RandomAccessFile(input, "r");
RandomAccessFile out = new RandomAccessFile(input.replace(
".lzw", ""), "rw");
try {
// Gets the first word in code and outputs its corresponding char
buffer[0] = in.readByte();
buffer[1] = in.readByte();
priorword = getvalue(buffer[0], buffer[1], onleft);
onleft = !onleft;
out.writeBytes(Array_char[priorword]);
// Reads every 3 bytes and generates corresponding characters
while (true) {
if (onleft) {
buffer[0] = in.readByte();
buffer[1] = in.readByte();
currword = getvalue(buffer[0], buffer[1], onleft);
} else {
buffer[2] = in.readByte();
currword = getvalue(buffer[1], buffer[2], onleft);
}
onleft = !onleft;
if (currword >= dictSize) {
if (dictSize < 4096) {
Array_char[dictSize] = Array_char[priorword]
+ Array_char[priorword].charAt(0);
}
dictSize++;
out.writeBytes(Array_char[priorword]
+ Array_char[priorword].charAt(0));
} else {
if (dictSize < 4096) {
Array_char[dictSize] = Array_char[priorword]
+ Array_char[currword].charAt(0);
}
dictSize++;
out.writeBytes(Array_char[currword]);
}
priorword = currword;
}
} catch (EOFException e) {
in.close();
out.close();
}
}
解决方案
推荐阅读
- javascript - 如何自动生成谷歌表单的预填链接
- javascript - 数组上的 JavaScript Async/Await console.log() 返回空
- pointers - 使用 dispose 并稍后将 NILL 分配给该指针的 Pascal 问题。仅当我在 z 中使用 a for x 时才会出现此问题
- macos - 如何在 Mojave MacOS 上安装 gcc-arm-none-eabi
- excel - VBA Internet Explorer - 对象变量消失
- react-native - 为共享同一存储库的 99% 的移动应用程序推荐的部署策略?
- spring - 限制一页上数据库结果的可见性-spring boot
- python - 如何减少python-docx中段落之间的空间
- spring-boot - SpringBoot 不解析没有 PropertySource 注释的 @Value 属性
- eclipse-cdt - Eclipse CDT - 提供每个文件构建设置的哪个扩展点?