目标是使用霍夫曼代码表将bitString转换为纯文本
r=000
h=001
o=01
w=100
d=1010
e=1011
l=11
我将霍夫曼代码表存储在两个不同的String[]
数组中:
String[] ch = {"r", "h", "o", "w", "d", "e", "l"};
String[] b = {"000", "001", "01", "100", "1010", "1011", "11"};
根据霍夫曼代码表,以下bitString等效于字符串“ helloworld”。
String bits = "001101111110110001000111010";
现在我想遍历每组位以匹配其对应的字符:
StringBuilder sb = new StringBuilder();
for(int i = 0; i < bits.length(); i++) {
if(bits.substring(0, b[i].length()).equals(b[i])) {
sb.append(ch[i]);
bits = bits.substring(b[i].length());
}
}
这里的问题是,每次找到匹配项时,我都找不到找到“重置”循环并返回到b[0]
的方法,因此我可以从头开始检查b[i]
。
答案 0 :(得分:0)
您需要按位“逐位”读取源数据,并每次都检查它是否现在是有效的霍夫曼代码。我建议您使用Map
来代替数组(或者您可以建立树结构并逐步遍历),否则性能会变得很慢,因为您必须逐个遍历整个数组大部分时间。
以下是使用霍夫曼代码表的示例:
import java.util.HashMap;
public class HuffmanDecoder {
private static HashMap<String, String> huffMap = new HashMap<>();
static {
huffMap.put("000", "r");
huffMap.put("001", "h");
huffMap.put("01", "o");
huffMap.put("100", "w");
huffMap.put("1010", "d");
huffMap.put("1011", "e");
huffMap.put("11", "l");
}
public final static void main(String[] args) {
char[] bits = "001101111110110001000111010".toCharArray();
StringBuffer result = new StringBuffer();
StringBuffer temp = new StringBuffer();
for (int i = 0; i < bits.length; i++) {
temp.append(bits[i]);
String val = huffMap.get(temp.toString());
if (val == null) {
continue;
}
result.append(val);
temp.setLength(0);
}
System.out.println(result);
}
}
一旦找到有效代码,就会将相应的解码值添加到结果缓冲区中,并重置临时缓冲区。缺少的是在接收到不会导致有效代码值的数据时发生一些错误处理,但是该实现是实际代码的依存关系,例如对于SFF数据(传真图像),解码器将继续读取,直到到达行尾标记为止。