Search code examples
javaandroidemv

Convert The 12-Character to Long


Authorised amount of the transaction. Format is "n 12" and length is 6 bytes for example a value of 1234567 is stored as Hex 00 00 01 23 45 67.

TLV > 9F02 06 000001234567

Q: How to convert 000001234567 to 1234567 ?

I tried like follows but it doesn't work:

public static long byteArrayToLong(@NonNull byte[] from, int offset, @NonNull EEndian endian) {
    try {
        byte[] fromFixed = new byte[8];
        if(from.length < 8) {
            System.arraycopy(from, 0, fromFixed, fromFixed.length-from.length, from.length);
        }
        else  {
            System.arraycopy(from, 0, fromFixed, 0, fromFixed.length);
        }
        if (endian == EEndian.BIG_ENDIAN) {
            return ((fromFixed[offset] << 24) & 0xff00000000000000L) | ((fromFixed[offset + 1] << 16) & 0xff000000000000L)
                    | ((fromFixed[offset + 2] << 8) & 0xff0000000000L) | ((fromFixed[offset + 3]) & 0xff00000000L)
                    | ((fromFixed[offset + 4] << 24) & 0xff000000) | ((fromFixed[offset + 5] << 16) & 0xff0000)
                    | ((fromFixed[offset + 6] << 8) & 0xff00) | (fromFixed[offset + 7] & 0xff);
        } else {
            return ((fromFixed[offset + 7] << 24) & 0xff00000000000000L) | ((fromFixed[offset + 6] << 16) & 0xff000000000000L)
                    | ((fromFixed[offset + 5] << 8) & 0xff0000000000L) | ((fromFixed[offset + 4]) & 0xff00000000L)
                    | ((fromFixed[offset + 3] << 24) & 0xff000000) | ((fromFixed[offset + 2] << 16) & 0xff0000)
                    | ((fromFixed[offset + 1] << 8) & 0xff00) | (fromFixed[offset] & 0xff);
        }
    } catch (Exception ex) {
        ex.printStackTrace();
    }
    return -1;
}

// calling above code

byte[] amountAuthorisedNumeric = transLogResponse.getAmountAuthorisedNumeric(i); // new byte[] {(byte)00x00, (byte)0x00, (byte)0x01, (byte)0x23, (byte)0x45, (byte)0x67}
Log.i(TAG, "AMOUNT1 is " + byteArrayToHexString(amountAuthorisedNumeric));       // 000001234567

amount = byteArrayToLong(amountAuthorisedNumeric, 0, BIG_ENDIAN); // error in here
Log.i(TAG, "AMOUNT2 is " + amount);                               // 19088743 (result expected is 1234567, not 19088743)

Solution

  • I suggest using BigInteger.

    import java.math.BigInteger;
    
    /**
     *
     * @author Sedrick
     */
    public class Main
    {
    
        public static void main(String[] args)
        {
            String value = "000001234567";
            BigInteger bigInteger = new BigInteger(value);
            System.out.println(bigInteger.longValue());
        }
    
    }
    

    Output:

    --- exec-maven-plugin:1.5.0:exec (default-cli) @ JavaTestingGround ---
    1234567
    ------------------------------------------------------------------------
    BUILD SUCCESS
    

    The other route is using Long to parse the value.

    /**
     *
     * @author Sedrick
     */
    public class Main
    {
    
        public static void main(String[] args)
        {
            String value = "000001234567";
    
            System.out.println(Long.parseLong(value));
        }
    
    }
    

    Output:

    1234567
    ------------------------------------------------------------------------
    BUILD SUCCESS