diff --git a/src/main/java/com/reandroid/arsc/decoder/ComplexUtil.java b/src/main/java/com/reandroid/arsc/decoder/ComplexUtil.java index fd521c1..05a0909 100644 --- a/src/main/java/com/reandroid/arsc/decoder/ComplexUtil.java +++ b/src/main/java/com/reandroid/arsc/decoder/ComplexUtil.java @@ -20,9 +20,10 @@ public class ComplexUtil { public static String decodeComplex(boolean fraction, int complex_value){ int radixFlag = (complex_value >> COMPLEX_RADIX_SHIFT) & COMPLEX_RADIX_MASK; Radix radix = Radix.forFlag(radixFlag); - int mantissa = (complex_value >> COMPLEX_MANTISSA_SHIFT) & COMPLEX_MANTISSA_MASK; - mantissa = mantissa << radix.getShift(); - float value = mantissa * MANTISSA_MULTIPLIER; + + int mantissa = (complex_value & ( COMPLEX_MANTISSA_MASK <> COMPLEX_UNIT_SHIFT) & COMPLEX_UNIT_MASK; Unit unit = Unit.fromFlag(fraction, unit_type); return radix.formatFloat(fraction, value) + unit.getSymbol(); @@ -132,16 +133,18 @@ public class ComplexUtil { }; } public enum Radix{ - RADIX_23p0(0, 23), - RADIX_16p7(1, 16), - RADIX_8p15(2, 8), - RADIX_0p23(3, 0); + RADIX_23p0(0, 23, MANTISSA_MULT), + RADIX_16p7(1, 16, 1.0f/(1<<7) * MANTISSA_MULT), + RADIX_8p15(2, 8, 1.0f/(1<<15) * MANTISSA_MULT), + RADIX_0p23(3, 0, 1.0f/(1<<23) * MANTISSA_MULT); private final int flag; private final int shift; - Radix(int flag, int shift) { + private final float multiplier; + Radix(int flag, int shift, float multiplier) { this.flag = flag; this.shift = shift; + this.multiplier = multiplier; } public String formatFloat(boolean scale, float value){ if(this.flag == 0){ @@ -195,12 +198,15 @@ public class ComplexUtil { public int getShift() { return shift; } + public float getMultiplier() { + return multiplier; + } } private static final int COMPLEX_RADIX_SHIFT = 4; private static final int COMPLEX_RADIX_MASK = 0x3; private static final int COMPLEX_MANTISSA_SHIFT = 8; - private static final int COMPLEX_MANTISSA_MASK = 0xffffff; - private static final float MANTISSA_MULTIPLIER = (1.0f / (1 << 23)); + private static final int COMPLEX_MANTISSA_MASK = 0x00ffffff; + private static final float MANTISSA_MULT = (1.0f / (1 << 8)); private static final int COMPLEX_UNIT_SHIFT = 0; private static final int COMPLEX_UNIT_MASK = 0xf; }