Как преобразовать строку текста в строку битов? - PullRequest
0 голосов
/ 29 января 2019

Я пытался создать своего рода кодировку One Time Pad в свободное время, чтобы немного научиться.Моя идея состояла в том, чтобы преобразовать входные данные (которые должны быть зашифрованы) в строку битов.Затем у меня есть пароль (также в виде строки битов), и вход зашифровывается с помощью XOR.например, pw = 101001, вход = 11001, затем enc = 0110. Моя проблема сейчас:

Как работает binary.append((val&128)==0 ? 0 : 1);?Я думаю, что могу переписать это как

if(val&128)==0{
   binary.append(0);
}else{
   binary.append(1);
}

Но как 2 числа (val & 128) могут равняться одному числу (0)?Это мой код:

String s ="foo";
 byte[] bytes = s.getBytes();
 StringBuilder binary = new StringBuilder();
 for(byte[] b : bytes){
   int val = b;
   for(int i=0; i<8; i++){
       binary.append((val&128)==0 ? 0 : 1);
       val <<= 1;
   }
 }
 System.out.println(s + " to binary: " + binary)

Спасибо за помощь:)

Ответы [ 2 ]

0 голосов
/ 29 января 2019

Объяснение как двоичный файл .append ((val & 128) == 0? 0: 1);рабочий

 for(byte[] b : bytes){
   int val = b;
   for(int i=0; i<8; i++){
       binary.append((val&128)==0 ? 0 : 1);
       val <<= 1;
   }
 }

val содержит значение байта 'b' как целое число, и каждый байт имеет 8 битов, поэтому цикл выполняется 8 раз, и каждый цикл времени проверяет, правильнее ли самая большая цифра 1 или нет.Если самый правый бит равен 1, тогда добавьте 1 в строителе строк (двоичное имя с изменяемым именем), иначе 0. и правый сдвиг val на 1.

  1. (val & 128) == 0?0: 1 ==> проверяет, является ли крайняя правая цифра 1 или нет
  2. val << = 1 ==> операция правого сдвига, например, val = 17 двоичный код val = 00010001 val << = 1 ==> двоичный кодval = 00100010, val = 34

binary.append ((val & 128) == 0? 0: 1);он добавляет 1 к двоичному (StringBuilder), если самый правый бит равен 1, в противном случае добавляет 0.

0 голосов
/ 29 января 2019

Оператор & принимает два целочисленных значения и сравнивает их по битам, чтобы получить другое целочисленное значение, которое генерируется путем записи двух значений int в двоичном формате между собой и сравнения каждого бита с операцией AND.

Результатом снова является двоичное число, которое преобразуется обратно в целое число из 10 оснований.Поэтому вы можете сравнить его с целым числом 0.

Пример :

15 & 7 = 7:
1111 (15) & 0111 (7) = 0111 (7)
...