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