В этой статье показаны пять примеров преобразования строки в двоичную строку или наоборот.
- Преобразовать строку в двоичный код –
Преобразовать строку в двоичный код –
- Преобразование строки в двоичный код – Немного Маскировки
Преобразовать двоичный файл в строку –
- Целое число.Синтаксический анализ
- Преобразуйте строку Юникода в двоичную.
1. Преобразование строки в двоичный код – Преобразование строки в двоичный код –
Шаги по преобразованию строки в двоичный формат.
- Преобразуйте строку в
символ[]
. - Зацикливает
символ[]
. Целое число.toBinaryString(символ)
для преобразования символов в двоичную строку.String.format
для создания отступов, если это необходимо.
package com.mkyong.crypto.bytes; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; public class StringToBinaryExample1 { public static void main(String[] args) { String input = "Hello"; String result = convertStringToBinary(input); System.out.println(result); // pretty print the binary format System.out.println(prettyBinary(result, 8, " ")); } public static String convertStringToBinary(String input) { StringBuilder result = new StringBuilder(); char[] chars = input.toCharArray(); for (char aChar : chars) { result.append( String.format("%8s", Integer.toBinaryString(aChar)) // char -> int, auto-cast .replaceAll(" ", "0") // zero pads ); } return result.toString(); } public static String prettyBinary(String binary, int blockSize, String separator) { Listresult = new ArrayList<>(); int index = 0; while (index < binary.length()) { result.add(binary.substring(index, Math.min(index + blockSize, binary.length()))); index += blockSize; } return result.stream().collect(Collectors.joining(separator)); } }
Выход
0100100001100101011011000110110001101111 01001000 01100101 01101100 01101100 01101111
2. Преобразуйте строку в двоично–разрядную маскировку.
2.1 В этом примере Java будет использоваться метод битовой маскировки для генерации двоичного формата из 8-битного байта.
package com.mkyong.crypto.bytes; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; public class StringToBinaryExample2 { public static void main(String[] args) { String input = "a"; String result = convertByteArraysToBinary(input.getBytes(StandardCharsets.UTF_8)); System.out.println(prettyBinary(result, 8, " ")); } public static String convertByteArraysToBinary(byte[] input) { StringBuilder result = new StringBuilder(); for (byte b : input) { int val = b; for (int i = 0; i < 8; i++) { result.append((val & 128) == 0 ? 0 : 1); // 128 = 1000 0000 val <<= 1; } } return result.toString(); } public static String prettyBinary(String binary, int blockSize, String separator) { //... same with 1.1 } }
Выход
01100001
Самое сложное – это этот код. Идея похожа на эту Java – Преобразование целого числа в двоичное с помощью битовой маскировки . В Java/|байт является 8-разрядным,
int является 32-разрядным, для целого числа
128 двоичный файл является
1000 0000 .
for (byte b : input) { int val = b; // byte -> int for (int i = 0; i < 8; i++) { result.append((val & 128) == 0 ? 0 : 1); // 128 = 1000 0000 val <<= 1; // val = val << 1 } }
Это &
является побитовым оператором И , только 1 & 1
является 1
, другие комбинации – это все 0
.
1 & 1 = 1 1 & 0 = 0 0 & 1 = 0 0 & 0 = 0
Это val
на самом деле val <<1
, это оператор сдвига влево на бит, он перемещает биты влево на 1 бит.
Просмотрите следующий проект: давайте предположим, что val
– это int
, или байт
представляет символ a
.
00000000 | 00000000 | 00000000 | 01100001 # val = a in binary 00000000 | 00000000 | 00000000 | 10000000 # 128 & # bitwise AND 00000000 | 00000000 | 00000000 | 00000000 # (val & 128) == 0 ? 0 : 1, result = 0 00000000 | 00000000 | 00000000 | 11000010 # val << 1 00000000 | 00000000 | 00000000 | 10000000 # 128 & # bitwise AND 00000000 | 00000000 | 00000000 | 10000000 # (val & 128) == 0 ? 0 : 1, result = 1 00000000 | 00000000 | 00000001 | 10000100 # val << 1 00000000 | 00000000 | 00000000 | 10000000 # 128 & 00000000 | 00000000 | 00000000 | 10000000 # result = 1 00000000 | 00000000 | 00000011 | 00001000 # val << 1 00000000 | 00000000 | 00000000 | 10000000 # 128 & 00000000 | 00000000 | 00000000 | 00000000 # result = 0 00000000 | 00000000 | 00000110 | 00010000 # val << 1 00000000 | 00000000 | 00000000 | 10000000 # 128 & 00000000 | 00000000 | 00000000 | 00000000 # result = 0 00000000 | 00000000 | 00001100 | 00100000 # val << 1 00000000 | 00000000 | 00000000 | 10000000 # 128 & 00000000 | 00000000 | 00000000 | 00000000 # result = 0 00000000 | 00000000 | 00011000 | 01000000 # val << 1 00000000 | 00000000 | 00000000 | 10000000 # 128 & 00000000 | 00000000 | 00000000 | 00000000 # result = 0 00000000 | 00000000 | 00110000 | 10000000 # val << 1 00000000 | 00000000 | 00000000 | 10000000 # 128 & 00000000 | 00000000 | 00000000 | 10000000 # result = 1 # collect all bits # 01100001
Для строки a
двоичная строка – это 01100001
.
3. Преобразуйте двоичный файл в строку.
В Java мы можем использовать Integer.parseInt(str, 2)
для преобразования двоичной строки в строку.
package com.mkyong.crypto.bytes; import java.util.Arrays; import java.util.stream.Collectors; public class StringToBinaryExample3 { public static void main(String[] args) { String input = "01001000 01100101 01101100 01101100 01101111"; // Java 8 makes life easier String raw = Arrays.stream(input.split(" ")) .map(binary -> Integer.parseInt(binary, 2)) .map(Character::toString) .collect(Collectors.joining()); // cut the space System.out.println(raw); } }
Выход
Hello
4. Преобразуйте строку Юникода в двоичную.
Мы можем использовать Юникод для представления неанглийских символов, поскольку строка Java поддерживает Юникод, мы можем использовать ту же технику битовой маскировки для преобразования строки Юникода в двоичную строку.
В этом примере преобразуется один китайский иероглиф 你
(Это означает вы
на английском языке) в двоичную строку.
package com.mkyong.crypto.bytes; import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; public class UnicodeToBinary1 { public static void main(String[] args) { byte[] input = "你".getBytes(StandardCharsets.UTF_8); System.out.println(input.length); // 3, 1 Chinese character = 3 bytes String binary = convertByteArraysToBinary(input); System.out.println(binary); System.out.println(prettyBinary(binary, 8, " ")); } public static String convertByteArraysToBinary(byte[] input) { StringBuilder result = new StringBuilder(); for (byte b : input) { int val = b; for (int i = 0; i < 8; i++) { result.append((val & 128) == 0 ? 0 : 1); // 128 = 1000 0000 val <<= 1; } } return result.toString(); } public static String prettyBinary(String binary, int blockSize, String separator) { //... same code 1.1 } }
Выход
3 111001001011110110100000 11100100 10111101 10100000
Для разных Юникодов требуются разные байты, и не для всех китайских символов требуется 3 байта памяти, некоторым может потребоваться больше или меньше байтов.
5. Преобразуйте двоичный код в строку Юникода.
Прочитайте комментарии для пояснения.
package com.mkyong.crypto.bytes; import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; public class UnicodeToBinary2 { public static void main(String[] args) { String binary = "111001001011110110100000"; // 你, Chinese character String result = binaryUnicodeToString(binary); System.out.println(result.trim()); } // <= 32bits = 4 bytes, int needs 4 bytes public static String binaryUnicodeToString(String binary) { byte[] array = ByteBuffer.allocate(4).putInt( // 4 bytes byte[] Integer.parseInt(binary, 2) ).array(); return new String(array, StandardCharsets.UTF_8); } }
Выход
你
Рекомендации
- Википедия – битовая маскировка
- Википедия – Побитовая И
- Википедия – Юникод
- Java – Преобразование целых чисел в двоичные использование битовой маскировки
- Ява – Как преобразовать массивы байтов в шестнадцатеричный
Оригинал: “https://mkyong.com/java/java-convert-string-to-binary/”