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

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

我无法比在这里发布相同问题的人更好地表达它:

http://www.experts-exchange.com/Programming/Programming_Languages/Java/Q_21062554.html

但为了保持它的原创性,我会用我自己的方式来描述它:假设我有一个字符串“00A0BF”,我想将它解释为字节[] {0x00,0xA0,0xBf},我应该怎么做?

我是一名Java新手,最终使用BigInteger并注意领先的十六进制零。 但我认为这很丑陋,我相信我错过了一些简单的事情......


这里有一个解决方案,我认为比任何发布到目前为止更好:

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不同)

  • 不将字符串转换为char[] ,或者为每个字节创建StringBuilder和String对象。

  • 如果参数不被认为是安全的,可以通过assert或异常自由地添加参数检查。


    单行:

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

    警告

  • 在Java 9 Jigsaw中,这不再是(默认)java.se根集的一部分,因此它将导致ClassNotFoundException,除非您指定--add-modules java.se.ee(感谢@ eckes
  • 在Android上不可用(感谢Fabian注意到这一点),但是如果系统由于某种原因缺少javax.xml ,则可以采用源代码。 感谢@ Bert Regelink提取源代码。

  • commons-codec中的Hex类应该为你做。

    http://commons.apache.org/codec/

    链接地址: http://www.djcxy.com/p/87203.html

    上一篇: Convert a string representation of a hex dump to a byte array using Java?

    下一篇: Unable to configure endpoints