Как преобразовать двоичную строку обратно в строку

Вот что я пытаюсь сделать. У меня есть строка:

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
Другие вопросы по тегам