在 JavaCard 平台上将 10 进制数转换为 256 进制数

Convert base 10 number to a base 256 number on the JavaCard platform

我想将大数的 ascii 表示形式转换为基本 256 字节数组表示形式。

更精确:满足以下测试。

JavaCard 平台上可用的最大数字类型是 short。

限制:我没有 javacardx.framework.math.BigNumber 可用。我已经有办法添加两个字节数组。 add(byte[], byte[]).

@Test
public void convertAsciiNumber1234567890ToByteArray() {

    byte[] asciiAmount = new byte[]{'1', '2', '3', '4', '5', '6', '7', '8', '9', '0'};

    byte[] result = ArrayUtil.convertAsciiAmount(asciiAmount, (short) 8);

    byte[] expected = new byte[]{0x00, 0x00, 0x00, 0x00, 0x49, (byte) 0x96, 0x02, (byte) 0xd2};
    assertEquals(expected[0], result[0]);
    assertEquals(expected[1], result[1]);
    assertEquals(expected[2], result[2]);
    assertEquals(expected[3], result[3]);
    assertEquals(expected[4], result[4]);
    assertEquals(expected[5], result[5]);
    assertEquals(expected[6], result[6]);
    assertEquals(expected[7], result[7]);
}

ArrayUtil.convertAsciiAmount的第二个参数是结果数组的长度。

基本思路是,将结果设置为第一个十进制数字后,循环遍历其余数字,将结果乘以 10 并加上当前数字。

乘法和加法例程使用标准 "Big Integer" 算法。请注意,您需要将中间结果保存在下一个最大的整数表示形式中,在本例中它很短。

您可以修改此代码,这样您就不必预先分配结果数组,而是在每次需要时增加它。

public class DecToHex
{
    static int BASE = 0xFF;
    static int SHIFT = 8;

    public static void main(String[] args)
    {
        byte[] ascii = new byte[]{'1', '2', '3', '4', '5', '6', '7', '8', '9', '0'};
        byte[] result = convertAsciiAmount(ascii, (byte)8);
        printAsHex(result);
    }

    static byte[] convertAsciiAmount(byte[] ascii, byte capacity)
    {
        byte len = 0;
        byte[] result = new byte[capacity];

        result[0] = (byte)(ascii[0]-'0');
        for(byte i=1; i<ascii.length; i++)
        {
            byte digit = (byte)(ascii[i]-'0');

            // multiply result by 10
            len += 1;           
            short prod = 0;
            for(byte j=0; j<len; j++)
            {
                prod += (10 * (result[j]  & BASE));
                result[j] = (byte)prod;
                prod >>>= SHIFT;
            }
            result[len] = (byte)prod;           
            while(len > 0 && result[len-1] == 0) len--;

            // add current digit            
            short sum = 0;
            sum += (result[0] & BASE) + (digit & BASE);
            result[0] = (byte)sum;
            sum >>>= SHIFT;

            for(byte j=1; j<len; j++)
            {
                sum += (result[j] & BASE);
                result[j] = (byte)sum;
                sum >>>= SHIFT;
            }

            if(sum > 0)
            {
                result[len++] = (byte)sum;
            }
        }       
        return result;
    }

    static void printAsHex(byte[] hex)
    {
        for(byte i=(byte)(hex.length-1); i>=0; i--)
        {
            System.out.print(String.format("0x%02X", (hex[i] & BASE)) + " ");
        }
        System.out.println();       
    }
}

输出:

0x00 0x00 0x00 0x00 0x49 0x96 0x02 0xD2