我正在尝试开发一个Java卡应用程序。将有一个动态输入字符串,其中包含字节数组中的电话号码,如:
byte[] number =new byte[] {1,2,3,4,5,6,7,8,9,5};
我希望将此数组更改为以下数组:
byte[] changed num = {(byte)0x0C, (byte)0x91, (byte)0x19, (byte)0x21, (byte)0x43, (byte)0x65, (byte)0x87, (byte)0x59}
前三个字节总是相同,剩下的5个将从传入的数组中更新。
我尝试了以下内容:
public static void main(String args[]){
byte[] number =new byte[] {1,2,3,4,5,6,7,8,9,5};
byte[] changednum = new byte[8];
changednum[0] = (byte)0x0C;
changednum[1] = (byte)0x91;
changednum[2] = (byte)0x19;
changednum[3] = (byte)0x(number[0] + number[1]*10);
changednum[4] = (byte)0x(number[2] + number[3]*10);
changednum[5] = (byte)0x(number[4] + number[5]*10);
changednum[6] = (byte)0x(number[6] + number[7]*10);
changednum[7] = (byte)0x(number[8] + number[9]*10);
System.out.println(Arrays.toString(changednum));
}
}
但最后5个值未转换为字节值
第
答案 0 :(得分:4)
这一行
changednum[3] = (byte)0x(number[0] + number[1]*10);
可以通过一组复杂的String操作来完成,简单的数学将如何做你想要的。
changednum[3] = (byte)(number[0] + number[1]*16);
需要*16
,因为您似乎假设数字是十六进制。
你可以使用循环
for (int i = 0; i < 4; i++)
changednum[i+3] = (byte)(number[i*2] + number[i*2+1]*16);
或使用+ =来避免演员
for (int i = 0; i < 4; i++)
changednum[i+3] += number[i*2] + number[i*2+1] * 16;
或者你可以写
for (int i = 0; i < 4; i++)
changednum[i+3] += number[i*2] + (number[i*2+1] << 4);
答案 1 :(得分:3)
虽然在这种情况下在Java标准版中不是很重要,但在Java Card中,性能通常至关重要。由于按位运算符,这个解决方案比接受的答案略快,它是一个没有32位整数的有效Java卡代码:
for (short i = 3, j = 0; i < 7; i++, j += 2) {
changednum[i] = (byte) ((number[j+1] << 4) | (number[j] & 0x0F));
}
答案 2 :(得分:1)
您可以使用将进行转换的方法Integer.toHexString
,
你需要仔细注意,在-128到127
final int f = -2211;
System.out.println(f);
System.out.println((byte) f);
System.out.println(Integer.toHexString((byte) f));
答案 3 :(得分:1)
在我看来,其他答案缺乏可读性。
此解决方案使用单独的方法和once()
来使方法工作而不传递偏移量和其他管道。它有一些奇怪的东西,比如常量和经过深思熟虑的标识符,异常,JavaDoc以及可维护性书中的其他可怕概念。
{{1}}