如何在Java中将十六进制字符串转换为字节数组

问题描述 投票:0回答:1

我想将十六进制字符串转换为字节数组,我知道已经问过这类问题,我已经尝试了他们的解决方案,但是这些解决方案不适用于我正在使用的库,我正在尝试将字符串

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]

但是我正在使用的库给出了一个无效键错误,因为该库除字节数组外都为as

[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;
    }

java string hex byte
1个回答
0
投票

此功能可以满足您的要求

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)的数字将表示为负数。这是因为jave中的byte已签名。

因此输出将是

[4 -98 82 11 -94 ...
© www.soinside.com 2019 - 2024. All rights reserved.