在java中将整数转换为字节十六进制

时间:2016-10-04 09:05:12

标签: java arrays javacard

我正在尝试开发一个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个值未转换为字节值

4 个答案:

答案 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

之间将explicity整数转换为字节will truncate its value in a range
 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}}