Я пытаюсь сделать простое кесарево смещение для двоичной строки, и оно должно быть обратимым. Я сделал это с помощью этого метода ..
public static String cShift(String ptxt, int addFactor)
{
String ascii = "";
for (int i = 0; i < ptxt.length(); i+=8)
{
int character = Integer.parseInt(ptxt.substring(i, i+8), 2);
byte sum = (byte) (character + addFactor);
ascii += (char)sum;
}
String returnToBinary = convertToBinary(ascii);
return returnToBinary;
}
В некоторых случаях это работает нормально. Тем не менее, я думаю, что когда он переворачивается, будучи представленным одним байтом, он необратим. На тестовой строке "test!22*F "
с addFactor
на 12
строка становится необратимой. Почему это так и как я могу это остановить?
edit: Для пояснения тестовая строка преобразуется в двоичный файл перед передачей. Вот convertToBinary
public static String convertToBinary(String str)
{
char [] array = str.toCharArray();
String binaryToBeReturned = "";
for (int i = 0; i < str.length(); i++)
{
String binary = Integer.toBinaryString((int)array[i]);
binary = padZeroes(binary);
binaryToBeReturned += binary;
}
return binaryToBeReturned;
}
Когда я запускаю это с cShift 12, а затем cShift -12 для реверса, я получаю это ...
01110100011001010111001101110100001000010011001000110010010001100010101000100000
111111111000000001110001011111111111111110000000001011010011111000111110010100100011011000101100
ÿ?qÿ?->>R6,
ÿótesÿót!22F*
Первая строка просто преобразует тестовую строку в двоичную. Вторая строка является результатом cShift в двоичном формате. Третья строка - результат преобразования ее в ascii, а четвертая строка - результат обращения с -12 в cShift и преобразования в ascii.
Для меня довольно ясно, что каким-то образом добавляются дополнительные биты после переворачивания, и я не совсем уверен, как с этим справиться. Спасибо.