Преобразование строкового представления битов в байт - PullRequest
9 голосов
/ 26 ноября 2011

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

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

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

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

Ответы [ 3 ]

6 голосов
/ 26 ноября 2011

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

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

      1111 1111 
<< 3: 1111 1000

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

      1111 1111 
>> 3: 1111 1111

      1000 0000
>> 3: 1111 0000

      0111 1111 
>> 3: 0000 1111

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

       1111 1111 
>>> 3: 0001 1111

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

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

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

Оператор побитового и *, 1030 * устанавливает биты в выводе в один, если и толькоесли бит включен как в 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           ^

Я, конечно, оставлю вам право применять это к вашей работе.

1 голос
/ 26 ноября 2011

Нарежьте String на длину 8 и вызовите Byte # parseByte . Если вы установите radix на 2, он будет анализировать String как двоичное число.

0 голосов
/ 26 ноября 2011

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

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

...