Я реализовал класс для кодирования Хаффмана. Класс будет анализировать входной файл и строить из него дерево хаффмана и создает карту, в которой каждый из отдельных символов появляется в файле как ключ и код хаффмана символа в качестве его значения.Как записать файл в Java после кодировки Хаффмана
Например, пусть строка «aravind_is_a_good_boy» будет единственной строкой в файле. Когда вы строите дерево huffman и генерируете код huffman для каждого символа, мы можем видеть, что для символа «a» код huffman равен «101», а для символа «r» код huffman равен «0101» и т. Д. .
Мое намерение состоит в том, чтобы сжать файл. Поэтому я не могу написать строку, которая создается путем замены каждого символа его кодом huffman непосредственно в файл. Поскольку каждый символ заменяется не менее чем на 3 символа (каждый '1' и '0' все равно записываются в файл как символ, а не биты). Поэтому я решил записать его в файл как байты, так как вы не можете записать биты в файл. Но тогда «a» и «r» записываются как «5» в файл. Это может вызвать проблемы при распаковке файла.
Это, как я уверен, преобразование последовательности бит в байты:
public byte[] compressString(String s, CharCodeHashMap map) {
String byteString = "";
byte[] byteArr = new byte[s.length()];
int size = 0;
for (int i = 0; i < s.length(); i++) {
byteString += addPaddingZeros(map.getCompressedChar(s.charAt(i)));
byteArr[size++] = new BigInteger(byteString, 2).toByteArray()[0];
byteString = "";
}
return byteArr;
}
Я попытался префиксов «1» для каждого из hashcodes, чтобы решить эту проблему. Но тогда, когда вы строите дерево хаффмана, читая файл, некоторые символы имеют более 8 бит. Тогда проблема new BigInteger(byteString, 2).toByteArray()
будет иметь более чем на 1 элемент в массиве. (Для например, если «v» имеет «11010001 хэш-код» и new BigInteger(byteString, 2).toByteArray()
возвращает массив элементов [0, -47].)
Can кто-то, пожалуйста, предложите мне способ записи в файл таким образом, чтобы файл был сжат и в то же время эти проблемы также позаботились.