Как преобразовать двоичную строку обратно в строку
Вот что я пытаюсь сделать. У меня есть строка:
String s="ch"
Я конвертирую его в двоичную строку следующим образом
char ar[]=s.toCharArray();
StringBuilder sb= new StringBuilder("00"); /* i am appending to extra zeros because
when i convert "ch" to binary string it
consists of 14 characters(0s and 1s) and i
need them to be a multiple of 8, so i add 2
0s to make it 16)*/
String wm=" ";
for(char c:ar)
{
wm=Integer.toBinaryString((int)c);
sb.append(wm);
}
Теперь я хочу преобразовать эту двоичную строку обратно в символ... так что я получаю обратно "ch" в качестве вывода. Кто-нибудь может помочь?
4 ответа
Вы можете разобрать двоичную строку в int
с Integer#parseInt(String s, int radix)
, а затем бросить его в char
:
char result = (char) Integer.parseInt(s, 2);
РЕДАКТИРОВАТЬ Ваша строка будет выглядеть так:
0011000111101000
00<--c--><--h-->
Получить c
а также h
отдельно нужно разделить String
, Попробуйте использовать String#substring()
чтобы получить части строки, принадлежащие различным буквам. Все строчные буквы имеют длину 7 цифр, поэтому это не должно быть слишком сложно.
Вы можете использовать Integer.parseInt
метод, чтобы преобразовать его в int
, но вы должны упомянуть основание (2). После этого вы можете конвертировать это int
к String
, Как это:
int chars = Integer.parseInt(wm, 2);
String str = new Character((char)chars).toString();
То, как вы добавили 0, неверно. Причина, по которой он равен двум 0, заключается в том, что когда c и h преобразуются в двоичный, c становится 1100011. Однако предполагается, что это 01100011, потому что мы смотрим на байт, поэтому вам нужно заполнять каждую двоичную строку левой клавишей, а не финальную. строка с 0.
Ваша последняя строка должна быть 0110001101101000, а не 0011000111101000.
как только вы правильно сформировали двоичную строку, вы можете использовать следующий код, чтобы вернуть ее обратно в строку.
StringBuilder result = new StringBuilder();
for(int i = 0; i < binaryStr.length(); i += 8){
result.append((char)Integer.parseInt(binaryStr.substring(i, i + 8), 2));
}
Возможно, есть и другие умные способы сделать это, но это то, что я могу придумать.
Одна вещь, которую следует учитывать, когда вы конвертируете свои символы в двоичные, чтобы удостовериться, что вы дополняете их нулями, чтобы длина двоичного файла составляла 8 бит. Это может быть достигнуто с помощью чего-то вроде этого:
// "%08d" will pad zeroes to the left if it's not 8 in length
String.format("%08d", Integer.parseInt(Integer.toBinaryString((int)c)))
Вы используете StringBuilder
построить двоичную строку, так что вы бы использовали выше String.format()
вот так:
String s = "ch";
StringBuilder sb = new StringBuilder();
for (char c : s.toCharArray()) {
sb.append(String.format("%08d", Integer.parseInt(Integer.toBinaryString((int)c))));
}
System.out.println(sb);
Результаты:
|--c---||--h---|
0110001101101000
И обратное (двоичное к символу) это будет:
for (int i = 0; i < sb.length(); i += 8) {
System.out.print((char)Integer.parseInt(sb.substring(i, i + 8), 2));
}
System.out.println();
Результаты:
ch
Все вместе будет выглядеть так:
public static void main(String[] args) throws Exception {
String s = "ch";
StringBuilder sb = new StringBuilder();
for (char c : s.toCharArray()) {
sb.append(String.format("%08d", Integer.parseInt(Integer.toBinaryString((int)c))));
}
System.out.println(sb);
for (int i = 0; i < sb.length(); i += 8) {
System.out.print((char)Integer.parseInt(sb.substring(i, i + 8), 2));
}
System.out.println();
}
Результаты:
0110001101101000
ch