Как я могу преобразовать мою строку (которая представляет шестнадцатеричные значения) в байтах? - PullRequest
2 голосов
/ 10 февраля 2020

У меня есть строка в Java, которая содержит 32 символа:

String tempHash = "123456789ABCDEF123456789ABCDEF12"; 

Каждый символ в строке выше представляет шестнадцатеричное значение. Мне нужно преобразовать его в другую строку, которая содержит 8 байтов, рассчитанных на каждый гекс из строки выше. Таким образом, в приведенном выше примере строка вывода будет:

"00000001 00000010 00000011 000001000 000001001 000001011 ..."

как я могу это сделать?

Я пытался сделать:

byte[] bytes1 = toByteArray(tempHash);

где

public static byte[] toByteArray(String s) {
    return DatatypeConverter.parseHexBinary(s);
}

но когда я перебираю этот массив:

for (byte singleByte: bytes1) {
    System.out.println(singleByte);
}

для первого символа я получаю 18 вместо 00000001. Я немного потерян здесь. Не могли бы вы помочь мне с этим?

Ответы [ 3 ]

3 голосов
/ 10 февраля 2020

Одним из решений является использование Stream:

String tempHash = "123456789ABCDEF123456789ABCDEF12";

String binary = tempHash.chars()              // Get stream of chars
    .map(c -> Character.digit(c, 16))         // Convert to hex digit
    .mapToObj(Integer::toBinaryString)        // Convert to binary
    .map(s -> "0".repeat(8 - s.length()) + s) // Pad left with zeros
    .collect(Collectors.joining(" "));        // Collect to String

System.out.println(binary);

Вывод:

00000001 00000010 00000011 00000100 00000101 ...

Как Кевин , указанный в его комментарий ниже, до- Java 11 решение было бы заменить вызов на String#repeat:

String binary = tempHash.chars()              // Get stream of chars
    .map(c -> Character.digit(c, 16))         // Convert to hex digit
    .mapToObj(Integer::toBinaryString)        // Convert to binary
    .map(s -> new String(new char[8 - s.length()]).replace('\0', '0') + s) // Pad left with zeros
    .collect(Collectors.joining(" "));        // Collect to String
0 голосов
/ 10 февраля 2020

Вы можете использовать Long.parseLong(String,16);

Если у вас есть значение long, вы можете получить байты, выполнив

long val = ...;
ByteBuffer buf = new ByteBuffer();
buf.put(0, val);

Если ваша строка слишком длинная, вам потребуется используйте BigInteger. По сути это то же самое, но немного сложнее

0 голосов
/ 10 февраля 2020
public byte hexToByte(String hexString) {
    int firstDigit = toDigit(hexString.charAt(0));
    int secondDigit = toDigit(hexString.charAt(1));
    return (byte) ((firstDigit << 4) + secondDigit);
}

private int toDigit(char hexChar) {
    int digit = Character.digit(hexChar, 16);
    if(digit == -1) {
        throw new IllegalArgumentException(
          "Invalid Hexadecimal Character: "+ hexChar);
    }
    return digit;
}

Здесь является ссылкой

...