Как преобразовать шестнадцатеричную строку в байтовый массив в Java - PullRequest
0 голосов
/ 20 апреля 2020

Я хочу преобразовать шестнадцатеричную строку в байтовый массив, я знаю, что вопросы такого типа уже задавались, я пробовал их решение, но эти решения не работают с библиотекой, которую я использую, я пытаюсь преобразовать строка

0x049e520ba27332ffed59ec7a34f744d4acd86ad22081d16f851d9f355ac09a70bdc14219c33ba7f5df62391a6f0f067c571bd6c03e83f81cd166e55fe043426a1c

Для байтового массива, но байтовый массив, который я получаю, имеет вид

[48, 120, 48, 52, 57, 101, 53, 50, 48, 98, 97, 50, 55, 51, 51, 50, 102, 102, 101, 100, 53, 57, 101, 99, 55, 97, 51, 52, 102, 55, 52, 52, 100, 52, 97, 99, 100, 56, 54, 97, 100, 50, 50, 48, 56, 49, 100, 49, 54, 102, 56, 53, 49, 100, 57, 102, 51, 53, 53, 97, 99, 48, 57, 97, 55, 48, 98, 100, 99, 49, 52, 50, 49, 57, 99, 51, 51, 98, 97, 55, 102, 53, 100, 102, 54, 50, 51, 57, 49, 97, 54, 102, 48, 102, 48, 54, 55, 99, 53, 55, 49, 98, 100, 54, 99, 48, 51, 101, 56, 51, 102, 56, 49, 99, 100, 49, 54, 54, 101, 53, 53, 102, 101, 48, 52, 51, 52, 50, 54, 97, 49, 99]

Но библиотека, которую я использую, выдает ошибку как неверный ключ, потому что библиотека исключает массив байтов должен быть

[4 158 82 11 162 115 50 255 237 89 236 122 52 247 68 212 172 216 106 210 32 129 209 111 133 29 159 53 90 192 154 112 189 193 66 25 195 59 167 245 223 98 57 26 111 15 6 124 87 27 214 192 62 131 248 28 209 102 229 95 224 67 66 106 28]

Как я могу сделать это в Java, я не знаю, что такое кодировка или как вычисляется байтовый массив

Это код

String publicKey = "0x049e520ba27332ffed59ec7a34f744d4acd86ad22081d16f851d9f355ac09a70bdc14219c33ba7f5df62391a6f0f067c571bd6c03e83f81cd166e55fe043426a1c
";

NewMessage message1 = Geth.newNewMessage();

message1.setPayload(message.getBytes());
message1.setPublicKey(WhisperHelper.hexStringToByteArray(publicKey));

public static byte[] hexStringToByteArray(String s) {
        int len = s.length();
        byte[] data = new byte[len / 2];
        for (int i = 0; i < len; i += 2) {
            data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
                    + Character.digit(s.charAt(i+1), 16));
        }
        return data;
    }

1 Ответ

0 голосов
/ 20 апреля 2020

Эта функция делает то, что вы хотите

public static byte[] getByteArray(String str) {
    if (!"0x".equals(str.substring(0,2))) {
        return null; // or throw some exception
    } else {
        String tmp = str.substring(2, str.length()-2);
        int bytes = tmp.length() / 2;
        byte[] array = new byte[bytes];

        for (int i = 0; i < bytes; i++) {
            byte b = (byte) ((Character.digit(tmp.charAt(i*2), 16) << 4)
                + Character.digit(tmp.charAt(i*2+1), 16));
            array[i] = b;
        }

        return array;
    }
}

за исключением того, что числа больше 127 (0x7F) будут представлены как отрицательные числа. Это потому, что byte s в jave подписаны.

Таким образом, выход будет

[4 -98 82 11 -94 ...
...