我正在處理我的 Huffman 壓縮(或解壓縮),但我無法正確解壓縮像 '?'、'?'、'?' 和 '?' 這樣的字符。字符“?”被解壓為兩個符號“??”。知道應該做什么嗎?
編輯:我認為這可能與 BufferedWriter 和 InputStream (以及其他)有關。我可能需要以 UTF-8 或其他方式讀寫?我怎么做?
編輯 2 :在一些幫助熱線的幫助下,我發現 '?' 和 '?' 作為單個字符寫入檔案。'?' 是否大于 1 個位元組,也許我假設每個字符在某處都是 1 個位元組?
public static void decompressFile() throws IOException {
byte[] compressedBytes = //somecode
int[] frequencyTable = //somecode
HuffmanNode root = //some code
//Generating code table
String[] codeTable = new String[256];
Huffman.getCodeTable(codeTable, root, "");
DataInputStream inputStream = new DataInputStream(new BufferedInputStream(new FileInputStream("[//thecompressedfile]"
BitInputStream bitInputStream = new BitInputStream(inputStream, compressedBytes.length);
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(newFileName));
HuffmanNode node = root;
int bit;
while ((bit = bitInputStream.readBit()) != -1) {
//int bit = bitInputStream.readBit();
System.out.print(bit "");
if (bit == 0) {
node = node.getLeft();
if (node.isLeaf()) {
bufferedWriter.write(node.getAByte());
node = root;
}
} else if (bit == 1) {
node = node.getRight();
if (node.isLeaf()) {
bufferedWriter.write(node.getAByte());
node = root;
}
}
}
bufferedWriter.close();
}
uj5u.com熱心網友回復:
您InputStream使用 a讀取并使用 a 寫入Writer。第一個用于讀取二進制資料,第二個用于寫入文本。當您呼叫bufferedWriter.write(node.getAByte()).
換句話說,您將二進制資料解釋為 ISO-8859-1,因為您基本上是將一個位元組轉換為 a char(從技術上講是int出于......奇怪的原因)。然后,無論平臺默認編碼是什么,您都可以將其寫回。
這會弄亂您的文本,除非它恰好是ISO-8859-1 編碼并且平臺默認編碼是相同的。
更好的方法是簡單地將其始終視為二進制資料(如果它真的是文本也可以,只要您不關心解釋代碼中的文本,而您似乎并不關心)。由于霍夫曼編碼作用于位元組流,因此也更符合您對資料所做的操作。
為此,將 替換為Writeran OutputStream(即 a FileOutputStream,BufferedOutputStream出于性能原因可能包含在 a中)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/352605.html
上一篇:在magento2中將產品添加到購物車后如何發送電子郵件?
下一篇:如何定期確定python陣列元素
