Преобразование строкового представления битов в байт

Я только начинаю узнавать о сжатии файлов, и я столкнулся с небольшим препятствием. У меня есть приложение, которое будет кодировать строку, такую как" программа", как сжатое двоичное представление "010100111111011000"(обратите внимание, что это все еще хранится в виде строки).

Encoding
g       111
r       10
a       110
p       010
o       011
m       00

теперь мне нужно записать это в файловую систему, используя FileOutputStream, проблема у меня есть, как я могу преобразовать строку "010100111111011000" в byte[]/bytes для записи в файловую систему с FileOutputStream?

Я никогда раньше не работал с битами/байтами, поэтому я здесь в тупике.

3 ответов


введение в операторы битового сдвига:

во-первых, у нас есть оператор сдвига влево, x << n. Это сдвинет все биты в x налево на n биты, заполняя новые биты нулем:

      1111 1111 
<< 3: 1111 1000

Далее, у нас есть подписанный оператор сдвига вправо, x >> n. Это сдвигает все биты в x справа, копируя бит знака в новые биты:

      1111 1111 
>> 3: 1111 1111

      1000 0000
>> 3: 1111 0000

      0111 1111 
>> 3: 0000 1111

наконец, у нас есть оператор правой смены с нулевым заполнением,x >>> n. Этот сдвигает все биты в x право n биты, заполняя новые биты нулем:

       1111 1111 
>>> 3: 0001 1111

вы также можете найти полезным побитовый оператор or,x | y. Это сравнивает биты в каждой позиции x и y, установка бита нового номера, если он был включен в любом x или y, в противном случае:

  1010 0101
| 1010 1010
  ---------
  1010 1111

вам нужны только предыдущие операторы для проблемы под рукой, но для полноты, вот последние два:

побитовый оператор and,x & y устанавливает биты в выходе на один, если и только если бит включен в обоих x и y:

  1010 0101
& 1010 1010
  ---------
  1010 0000

побитовый оператор xor,x ^ y устанавливает выходные биты в один, если бит включен в одном номере или другом, но не оба:

  1010 0101
^ 1010 1010
  ---------
  0000 1111

теперь, применяя их к ситуации под рукой:

вам нужно будет использовать операторы битового сдвига для добавления и управления битами. Начать установку бита правая сторона в соответствии с их строковыми представлениями и сдвигает их. Продолжайте, пока не дойдете до конца байта, а затем перейдите к следующему байту. Скажем, мы хотим создать байтовое представление "1100 1010":

Our byte    Target
---------   --------
0000 0000
            1100 1010
0000 0001   ^
            1100 1010
0000 0011    ^
            1100 1010
0000 0110     ^
            1100 1010
0000 1100      ^
            1100 1010
0001 1001        ^
            1100 1010
0011 0010         ^
            1100 1010
0110 0101          ^
            1100 1010
1100 1010           ^

Чоп свой String на длине 8 и звонок байт#parseByte. Если вы установите radix to 2, он будет парсить String Как двоичное число.


Я думаю, вы хотите писать эти нули и единицы в виде двоичных значений в файл. Я так, вы можете повторять строку, принимая 8 знаков каждый раз (строка.substring () или smth) и создавать байты с помощью конструктора Byte (String). Это самое простое решение, которое приходит мне в голову.

Если я не прав насчет проблемы, расскажите больше об этом, пожалуйста.