Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JavaCard平台上,将基数10转换为基数256_Java_Arrays_Javacard - Fatal编程技术网

在JavaCard平台上,将基数10转换为基数256

在JavaCard平台上,将基数10转换为基数256,java,arrays,javacard,Java,Arrays,Javacard,我想将一个大数字的ascii表示形式转换为一个基本的256字节数组表示形式 更精确:满足以下测试 JavaCard平台上可用的最大数字类型是short 限制:我没有可用的javacardx.framework.math.BigNumber。我已经有了添加双字节数组的方法添加(字节[],字节[]) ArrayUtil.ConvertAsciiaMont的第二个参数是结果数组的长度 基本思想是,一旦将结果设置为第一个十进制数字,然后循环剩余的数字,将结果乘以10,再加上当前数字 乘法和加法例程使用标

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

更精确:满足以下测试

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

限制:我没有可用的
javacardx.framework.math.BigNumber
。我已经有了添加双字节数组的方法<代码>添加(字节[],字节[])


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

基本思想是,一旦将结果设置为第一个十进制数字,然后循环剩余的数字,将结果乘以10,再加上当前数字

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

您可以修改此代码,这样就不必预先分配结果数组,而是在每次需要时对其进行扩展

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();       
    }
}

非常感谢。convertAsciiAmount()几乎可以工作,我只需要反转结果并在必要时用short替换int。不管怎样,我都会接受你的答案。对不起,我发现用小端点思考要容易得多,但你想要一个大端点的结果。正如你所说,你可以逆转结果。
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