在Java中,如何将十六进制字符串转换为byte []?

Bha*_*ani 33 java hex

我在Java中使用以下函数将加密的String转换为十六进制格式:

public static String toHex(byte [] buf) {
    StringBuffer strbuf = new StringBuffer(buf.length * 2);
    int i;
    for (i = 0; i < buf.length; i++) {
        if (((int) buf[i] & 0xff) < 0x10) {
            strbuf.append("0");
        }
        strbuf.append(Long.toString((int) buf[i] & 0xff, 16));
    }
    return strbuf.toString();
}
Run Code Online (Sandbox Code Playgroud)

现在我想将该十六进制字符串转换回字节数组.我怎样才能做到这一点?

例如,

(1) Plain Text = 123
(2) Encrypted Text = «h>kq*«¬Mí“~èåZ  \}?
(3) Encrypted Text in Hex = f263575e7b00a977a8e9a37e08b9c215feb9bfb2f992b2b8f11e
Run Code Online (Sandbox Code Playgroud)

我可以去(2)(3),但我怎么走的时候(3)(2)

dAR*_*NCE 95

接受的答案不考虑可能导致问题的前导零

这个问题回答了它.取决于您是要查看其完成方式还是仅使用java内置方法.以下是复制的解决方案,这个这个来自提到的SO问题分别回答.

选项1:Util方法

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;
}
Run Code Online (Sandbox Code Playgroud)

选项2:单线内置

import javax.xml.bind.DatatypeConverter;

public static String toHexString(byte[] array) {
    return DatatypeConverter.printHexBinary(array);
}

public static byte[] toByteArray(String s) {
    return DatatypeConverter.parseHexBinary(s);
}
Run Code Online (Sandbox Code Playgroud)

  • 不过,单行内置似乎不再是 Java 9 内置的了,因为简单地导入 `javax.xml.bind.DatatypeConverter` 是行不通的。 (3认同)

Kus*_*han 43

 String s="f263575e7b00a977a8e9a37e08b9c215feb9bfb2f992b2b8f11e";
 byte[] b = new BigInteger(s,16).toByteArray();
Run Code Online (Sandbox Code Playgroud)

  • 这并没有给我我想要的结果,但是dARKpRINCE的响应中的简单单行方法确实如此. (6认同)

小智 5

我发现DatatypeConverter.parseHexBinary比以下代码更昂贵(两倍):

org.apache.commons.codec.binary.Hex(str.toCharArray())
Run Code Online (Sandbox Code Playgroud)