我的 android 程序有以下方法,用 Java 编写。
该方法接受一个十六进制字符串并返回一个用 ascii 编写的相同文本的字符串。
public static String hexToString(String hex)
{
StringBuilder sb = new StringBuilder();
for (int count = 0; count < hex.length() - 1; count += 2)
{
String output = hex.substring(count, (count + 2)); //grab the hex in pairs
int decimal = Integer.parseInt(output, 16); //convert hex to decimal
sb.append((char)decimal); //convert the decimal to character
}
return sb.toString();
}
该方法运行良好,但我的程序对时间要求很高,而且该方法可能被调用了数万次。在分析我的程序的慢位时,这种方法占用了太多时间,因为:
Integer.parseInt(output, 16);
和
hex.substring(count, (count + 2));
以最慢的顺序排列。
有谁知道实现相同目标的更快方法?
最佳答案
不要在每次迭代时都创建一个新的字符串。提高性能的一种方法是使用 char 数组并对每个字符应用数学运算。
public static String hexToString(String hex) {
StringBuilder sb = new StringBuilder();
char[] hexData = hex.toCharArray();
for (int count = 0; count < hexData.length - 1; count += 2) {
int firstDigit = Character.digit(hexData[count], 16);
int lastDigit = Character.digit(hexData[count + 1], 16);
int decimal = firstDigit * 16 + lastDigit;
sb.append((char)decimal);
}
return sb.toString();
}
有关此方法的更多信息:
此外,如果您成对解析十六进制字符串,您可以按照@L7ColWinters 的建议使用查找表:
private static final Map<String, Character> lookupHex = new HashMap<String, Character>();
static {
for(int i = 0; i < 256; i++) {
String key = Integer.toHexString(i);
Character value = (char)(Integer.parseInt(key, 16));
lookupHex.put(key, value);
}
}
public static String hexToString(String hex) {
StringBuilder sb = new StringBuilder();
for (int count = 0; count < hex.length() - 1; count += 2) {
String output = hex.substring(count, (count + 2));
sb.append((char)lookupHex.get(output));
}
return sb.toString();
}
关于java - Java 中的 Hex To String 性能太慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12039341/