Рубрики
Без рубрики

Java – Преобразование строки в двоичный код

В этой статье показано, как использовать Integer.toBinaryString или битовая маскировка для преобразования строки в двоичный строковый представитель.

В этой статье показаны пять примеров преобразования строки в двоичную строку или наоборот.

  1. Преобразовать строку в двоичный код – Преобразовать строку в двоичный код –
  2. Преобразование строки в двоичный код – Немного Маскировки Преобразовать двоичный файл в строку –
  3. Целое число.Синтаксический анализ
  4. Преобразуйте строку Юникода в двоичную.

1. Преобразование строки в двоичный код – Преобразование строки в двоичный код –

Шаги по преобразованию строки в двоичный формат.

  1. Преобразуйте строку в символ[] .
  2. Зацикливает символ[] .
  3. Целое число.toBinaryString(символ) для преобразования символов в двоичную строку.
  4. 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) {

        List result = 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);
    }

}

Выход

Рекомендации

Оригинал: “https://mkyong.com/java/java-convert-string-to-binary/”