【问题标题】:jadx result a fail sourcode?jadx 导致失败的源代码?
【发布时间】:2017-03-26 19:31:44
【问题描述】:

我刚刚使用Jadx 反编译了*.apk 文件。该应用程序仍然可以正常运行。在 Java Decompiler 上查看结果:

public class Information extends BaseInformation implements InformationInterface {
    private static final String LOG_TAG = "Information.java";
    public String decimalLength;
    public String expression;
    public String length;
    public String signed;
    public String start;
    public String unit;

    public Information() {
        this.signed = "N";
    }

    public String toString() {
        return "information name = " + this.nameZh;
    }

    public boolean isSigned() {
        if ("Y".equals(this.signed)) {
            return true;
    }
    return false;
}

public String getValue() {
    if (BluetoothTools.cmdArray == null || BluetoothTools.cmdArray.size() == 0) {
        return this.unit;
    }
    int startInt = Integer.parseInt(this.start);
    int lengthInt = Integer.parseInt(this.length);
    int dLength = Integer.parseInt(this.decimalLength);
    StringBuffer sb = new StringBuffer();
    int i;
    StringBuffer stringBuffer;
    int i2;
    if (ConfigManager.getInstance().isBigEndian()) {
        for (i = (startInt + lengthInt) - 1; i >= startInt; i--) {
            stringBuffer = sb;
            i2 = 0;
            stringBuffer.insert(i2, (String) BluetoothTools.cmdArray.get(i));
        }
    } else {
        for (i = startInt; i < startInt + lengthInt; i++) {
            stringBuffer = sb;
            i2 = 0;
            stringBuffer.insert(i2, (String) BluetoothTools.cmdArray.get(i));
        }
    }
    String hexString = sb.toString();
    long intValue = 0;
    try {
        if (isSigned()) {
            intValue = new BigInteger(Hex2StringUtils.hexStringToByte(hexString)).longValue();
            Log.i(LOG_TAG, "isSigned intValue: " + intValue);
        } else {
            intValue = Long.parseLong(hexString, 16);
        }
    } catch (NumberFormatException e1) {
        e1.printStackTrace();
    }
    String value = "";
    try {
        BigDecimal b = new BigDecimal(new ExpressionParser().calculate(this.expression.replace("x", new StringBuilder(String.valueOf(intValue)).toString())));
        if (dLength > 0) {
            return new StringBuilder(String.valueOf(b.setScale(dLength, 4).doubleValue())).append(this.unit).toString();
        } else if (dLength != 0) {
                   return value;
               } else {
                          return new StringBuilder(String.valueOf(b.setScale(dLength, 4).intValue())).append(this.unit).toString();
                      }
        } catch (ParserException e) {
            e.printStackTrace();
            return value;
        }
    }
}

这个类是否反编译失败?

StringBuffer sb 会发生什么?

它看起来不包含任何字符串,所以hexString 仍然为 NULL。

谁能解释一下?

【问题讨论】:

    标签: java decompiler


    【解决方案1】:

    在两个地方有内容插入到字符串缓冲区中。比如这里

            stringBuffer = sb;
            i2 = 0;
            stringBuffer.insert(i2, (String) BluetoothTools.cmdArray.get(i));
    

    所以不,hexString 的结果不会为空(或空字符串)。

    【讨论】:

    • hexString 是 sb 的字符串 hexString = sb.toString();但是 sb 没有插入任何地方。
    • @Sang Seu:注意stringBuffer = sb; 的分配。这意味着在 sb 引用的同一对象上调用 stringBuffer.insert(…)
    • 如果我不想使用stringBuffer,这行吗? sb.insert(i2, (String) BluetoothTools.cmdArray.get(i));
    猜你喜欢
    • 1970-01-01
    • 2012-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多