使用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如果未知参数是安全的,请随时通过或例外添加参数检查。