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

标签 java string hex byte

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

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]

但是我正在使用的库给出了无效 key 的错误,因为该库将字节数组除外

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

最佳答案

这个函数可以实现你想要的功能

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) 的数字将表示为负数。这是因为 java 中的字节是有符号的。

所以输出将是

[4 -98 82 11 -94 ...

关于java - Java中如何将十六进制字符串转换为字节数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61319177/

相关文章:

java - ViewPager中的android ImageView——实现图像的触摸手势缩放

java - Struts2 PermGen 内存不足错误

c++拆分一个字符串

c# - 在文本中查找查询匹配项

python - 将时间字符串转换为单独的十六进制字节

php - [PHP]将RGB或HEX转换为 "Long Int"颜色

java - 在同一注册页面JSP和Servlet中加载数据列表

python - 获取一串数字并插入 + 和 - 运算符

objective-c - 将 NSString 转换为字符数组

java - 如何为 REST Web 服务创建 JUnit 测试?