我在java中實現了一個霍夫曼編碼,它處理來自輸入文件的字節數據。但是,它只適用於壓縮ascii。我想擴展它,以便它可以處理大於1個字節的字符,但我不確定如何完全做到這一點。霍夫曼編碼 - 處理unicode
private static final int CHARS = 256;
private int [] getByteFrequency(File f) throws FileNotFoundException {
try {
FileInputStream fis = new FileInputStream(f);
byte [] bb = new byte[(int) f.length()];
int [] aa = new int[CHARS];
if(fis.read(bb) == bb.length) {
System.out.print("Uncompressed data: ");
for(int i = 0; i < bb.length; i++) {
System.out.print((char) bb[i]);
aa[bb[i]]++;
}
System.out.println();
}
return aa;
} catch (FileNotFoundException e) { throw new FileNotFoundException();
} catch (IOException e) { e.printStackTrace(); }
return null;
}
例如,這是我用來獲取文件中字符的頻率,顯然它只能在單個字節上工作。如果我給它一個unicode文件,我得到一個ArrayIndexOutOfBoundsException在aa[bb[i]]++;
,我通常是一個負數。我知道這是因爲aa[bb[i]]++;
只能看一個字節,並且unicode字符將會不止一個字節,但我不知道如何改變它。
有人可以給我一些指針嗎?
爲什麼把它當作unicode而不是字節數組? –
@JeffFerland:如果你看他的代碼 - 他使用它作爲一個字節數組,他只是落入「簽名字節」坑。 – DThought