使用Java将十六进制转储的字符串表示形式转换为字节数组?


问题内容

我正在寻找一种方法来转换长字符串(从转储),该字符串将十六进制值转换为字节数组。

我的口头禅比在这里发表同样问题的人更好。

但是为了保持其原始性,我将以自己的方式来表述:假设我有一个字符串"00A0BF",我想将其解释为

byte[] {0x00,0xA0,0xBf}

我该怎么办?

我是Java的新手,最终使用BigInteger并注意前导十六进制零。但是我认为这很丑陋,并且我肯定我缺少一些简单的东西。


问题答案:

我认为以下解决方案比迄今为止发布的解决方案更好:

/* s must be an even-length string. */
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;
}

改进的原因:

  • 前导零(与BigInteger不同)和负字节值(与Byte.parseByte不同)是安全的

  • 不会将String转换为char[],也不会为每个字节创建StringBuilder和String对象。

  • 没有可能不可用的库依赖项

assert如果未知参数是安全的,请随时通过或例外添加参数检查。