我有以下将十六进制字符串转换为字节数组的方法。尽管我可以使用Apache's-commons编解码器库中可用的方法来实现相同的目的,DatatypeConverter.parseHexBinary()
和使用BigInteger
。但是我需要的只是性能。是否有办法以某种方式进一步优化下面的代码?
public static byte[] decodeHexString(String hexString) {
if (hexString.length() % 2 == 1) {
hexString = "0" + hexString;
}
byte[] bytes = new byte[hexString.length() / 2];
for (int i = 0; i < hexString.length(); i += 2) {
bytes[i / 2] = hexToByte(hexString.substring(i, i + 2));
}
return bytes;
}
private static byte hexToByte(String hexString) {
int firstDigit = Character.digit(hexString.charAt(0), 16);
int secondDigit = Character.digit(hexString.charAt(1), 16);
return (byte) ((firstDigit << 4) + secondDigit);
}
答案 0 :(得分:1)
您最大的性能影响将是使用substring
,并调用"0" +
,我还将查看您是否也可以删除Character.digit
的使用,最后,您也许可以不会每次都创建byte[]
。进一步的优化是不要在循环开始时使用% 2
或在循环中不使用i / 2
。
这样的事情。
// assume the input is valid.
static int digit(char ch) {
return ch < 'A' ? ch - '0' : (ch & 31) + 10;
}
public static byte[] decodeHexString(String hexString) {
byte[] bytes = new byte[(hexString.length() + 1) / 2];
int i = 0, j = 0;
if ((hexString.length() & 1) != 0) {
bytes[i++] = (byte) digit(hexString.charAt(j++));
}
for (; j < hexString.length(); i++, j += 2)
bytes[i] = (byte) ((digit(hexString.charAt(j)) << 4) + digit(hexString.charAt(j + 1)));
return bytes;
}
要重用byte[]
,您必须传递一个数组以使用,避免创建它。
您可以通过使用反射来获取String中的基础数组来进一步优化此效果。