Преобразование строкового представления битов в байт
Я только начинаю узнавать о сжатии файлов, и я столкнулся с небольшим препятствием. У меня есть приложение, которое будет кодировать строку, такую как" программа", как сжатое двоичное представление "010100111111011000"
(обратите внимание, что это все еще хранится в виде строки).
Encoding
g 111
r 10
a 110
p 010
o 011
m 00
теперь мне нужно записать это в файловую систему, используя FileOutputStream
, проблема у меня есть, как я могу преобразовать строку "010100111111011000" в byte[]
/byte
s для записи в файловую систему с 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). Это самое простое решение, которое приходит мне в голову.
Если я не прав насчет проблемы, расскажите больше об этом, пожалуйста.