gpt4 book ai didi

java - 在 JavaCard 平台上将基数 10 的数字转换为基数 256 的数字

转载 作者:行者123 更新时间:2023-11-30 02:26:54 29 4
gpt4 key购买 nike

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

更精确:满足以下测试。

JavaCard 平台上可用的最大数值类型是短型。

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

@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 并添加当前数字。

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

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

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 

关于java - 在 JavaCard 平台上将基数 10 的数字转换为基数 256 的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45419331/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com