我正在寻找一种将表示十六进制值的长字符串(从转储)转换为字节数组的方法.
我的措辞再好不过了,那人发了the same question here条.
但是为了保持它的原创性,我将以我自己的方式表达它:假设我有一个字符串"00A0BF"
,我想将其解释为
byte[] {0x00,0xA0,0xBf}
我该怎么办?
我是一名Java新手,最终使用了BigInteger
并注意前导的十六进制零.但我觉得这很难看,我肯定我错过了一些简单的东西.
我正在寻找一种将表示十六进制值的长字符串(从转储)转换为字节数组的方法.
我的措辞再好不过了,那人发了the same question here条.
但是为了保持它的原创性,我将以我自己的方式表达它:假设我有一个字符串"00A0BF"
,我想将其解释为
byte[] {0x00,0xA0,0xBf}
我该怎么办?
我是一名Java新手,最终使用了BigInteger
并注意前导的十六进制零.但我觉得这很难看,我肯定我错过了一些简单的东西.
更新(2021)-Java 17现在包括java.util.HexFormat
个(只花了25年):
HexFormat.of().parseHex(s)
这里有一个我认为比目前发布的任何解决方案都更好的解决方案:
/* 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)是安全的
不会将字符串转换为char[]
,也不会 for each 字节创建StringBuilder和字符串对象.
没有可能不可用的库依赖项
如果参数不安全,可以通过assert
或异常添加参数判断.