我有一个byte [5]数组,表示以十六进制字符串形式打印时的十进制数。两个数字可以存储在一个字节中,不使用十六进制字符。 E.g。
[0x11,0x45,0x34,0x31,0x21] -> 1145343121.
在Java中是否有更有效的方法(可能有些位移技术)转换为除
之外的十进制数字long result = Long.parseLong(byteToHexString(bytes[]));?
有效的转换反之亦然......
答案 0 :(得分:3)
((a[0]>>>4)*1000000000L + (a[0]&15)*100000000L +
(a[1]>>>4)* 10000000L + (a[1]&15)* 1000000L +
(a[2]>>>4)* 100000L + (a[2]&15)* 10000L +
(a[3]>>>4)* 1000L + (a[3]&15)* 100L +
(a[4]>>>4)* 10L + (a[4]&15))
答案 1 :(得分:2)
在这里,诀窍是一次蚕食nibble
!
byte[] buf = { 0x11, 0x45, 0x34, 0x31, 0x21 };
long result = 0;
for (int i = 0; i < buf.length; i++) {
result = result * 100 + (buf[i] >> 4 & 0XF) * 10 + (buf[i] & 0XF);
}
System.out.println(result);
<强>输出强>
1145343121
答案 2 :(得分:1)
在Knuth之后,计算机程序设计艺术第二卷精神数学算法,回答练习4.4(19):
public long binaryValue(long bcd)
{
long x = bcd;
x -= ((x & 0xf0f0f0f0f0f0f0f0L) >> 4)*(0x10-10);
x -= ((x & 0xff00ff00ff00ff00L) >> 8)*(0x100-100);
x -= ((x & 0xffff0000ffff0000L) >> 16)*(0x10000-10000);
x -= ((x & 0xffffffff00000000L) >> 32)*(0x100000000L-100000000);
return x;
}