2013-04-29 1 views
2

В настоящее время я работаю над декодированием huffman. У меня есть String представление всех кодировок символов (например, «1101000100000001»). Я пытаюсь разбить его на группы по 8 и вернуть его соответствующее значение (т. Е. «11010001» вернет 209). Однако, похоже, он не работает с меньшими файлами. Ниже приведен код, который у меня есть. Заранее спасибо за вашу помощь!Последовательность разделения 1 и 0 в байтах

for(char bit : textbytes.toCharArray()) 
      { 
       if(bit == '1') 
       { 
        target |= 1 << bitCount; 
       } 
       bitCount++; 
       if(bitCount >= 8) 
       { 
        bitCount = 0; 
        bits.add(target); 
        target = 0; 
       } 
      } 
      byte[] bitstring = new byte[bits.size()]; 
      for(int i = 0; i < bits.size(); i ++) 
      { 
       bitstring[i] = bits.get(i); 
       compressedFile.write(bitstring[i]); 
      } 

P.S. Некоторые части, которые я взял из Интернета, так что я не в полной мере понять его (например, target |= 1<< bitCount)

+0

Любые конкретные предпочтения языка? – CodyBugstein

+0

Простите, пожалуйста, Java! – somtingwong

+0

Я думаю, вы должны использовать его с 0s –

ответ

1

Похоже, вы не пытаетесь сделать Хаффман еще, просто превратить «двоичным» String s из 0 или 1 в Java целочисленные типы. Попробуйте это:

public static long decode(String textbytes) { 
    long result=0; 

    for(char ch : textbytes.toCharArray()) { 
     result = result << 1; 
     if(ch == '1') 
      result = result + 1; 
    } 

    return result; 
} 

Этот метод декодирует битовые строки в Java long с. Не нужно беспокоиться о том, чтобы разбить куски 8 (если это не домашнее задание, и это часть задания). В частности, он обрабатывает пример, который вы дали правильно («11010001» => 209).

подход довольно прост:

  1. Старт с result = 0
  2. Для каждого символа в строке ввода, сдвиг result 1 бит влево, чтобы «освободить место» для бита, представленного текущим символом , Затем добавьте 1, чтобы получить результат, если текущий символ представляет бит 1.

Кроме того, в коде предполагается, что вы не получите бит строк длиной более 64 бит, что вы можете проверить на надежность.

+0

Если я использую метод ReadI (FileInputStream) для чтения байтов, то будет ли он по-прежнему неважно, как много бит есть? Я знаю, что метод read() читается в байте данных, поэтому, если «1101000100000001» закодирован полностью, не будучи разбитым, повлияет ли это на то, как работает read()? – somtingwong

+0

Из-за того, как я храню данные (в 'long'), этот метод обрабатывает только до 64 бит. Если вы сохранили данные по-разному - например, в «BigInteger», как в другом ответе в этом потоке, этот метод обрабатывал бы столько бит, сколько вы могли бы набросить на него (конечно, память). Пока вы уверены, что только символы, которые вы будете читать, либо «1», либо «0», не имеет значения, читаете ли вы символы или байты. – sigpwned

1

Я хотел бы сделать это по-другому

byte[] bytes = new BigInteger("1101000100000001", 2).toByteArray(); 
    for (byte b : bytes) { 
     compressedFile.write(b); 
    } 
Смежные вопросы