在 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
我想将大数的 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