java - Java 中的 Hex To String 性能太慢

标签 java android performance hex ascii

我的 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/

相关文章:

java - Java 中的 SimpleDateFormat 异常

java - Swing , 多屏 , 控制权转移

java - jsp需要写一段不同颜色的文字

php - 如何使用 getLatitude() 返回的 double 值等 GPS 数据?

ios - UITableView 滚动在 iOS 模拟器中不稳定

python - 嵌套for循环慢速python计算特殊标准差

javascript - JS 1-2k 变量使页面加载缓慢

java - Android NDK 是否加密编译的 c++ 文件?

java - 覆盖率报告称 android 上的 gradle 覆盖率为零

android - NoClassDefFoundError for Guava's ImmutableMap with Dagger 2 for Android