Java 如何将字节数组转换为十六进制字符串,并将其转换为long?
我尝试将byte[]转换为long,但得到了java.lang.NumberFormatException 这是我想转换为long的字节数组Java 如何将字节数组转换为十六进制字符串,并将其转换为long?,java,Java,我尝试将byte[]转换为long,但得到了java.lang.NumberFormatException 这是我想转换为long的字节数组 byte[] data = new byte[]{(byte) 0xDB, (byte) 0xA7, 0x53, (byte) 0xF8, (byte) 0xA8, 0x0C, 0x66, 0x8}; 然后我尝试用这个算法将数据转换成十六进制字符串 public static String hexStringFromHexData(byte[] data
byte[] data = new byte[]{(byte) 0xDB, (byte) 0xA7, 0x53, (byte) 0xF8, (byte) 0xA8, 0x0C, 0x66, 0x8};
然后我尝试用这个算法将数据转换成十六进制字符串
public static String hexStringFromHexData(byte[] data){
StringBuilder hexString = new StringBuilder();
for (byte subData : data) {
String temp = Integer.toHexString(subData & 0xFF);
if (temp.length() == 1) {
temp = "0" + temp;
}
hexString.append(temp);
}
return hexString.toString();
}
所以我得到了这样的十六进制字符串“dba753f8a80c6608”
用这个十六进制字符串,我把它转换成下面的long
String hexstring = "dba753f8a80c6608";
Long value = Long.parseLong(hexString.trim(), 16);
它抛出NumberFormatException,因为hexstring超过7fffffffffffff(Long.MAX_值)
右十六进制字符串必须与“DBA753F8A80C668”类似,并且使用此十六进制字符串可以将其转换为长值98923198392832982L,无异常
我们可以尝试将这个长值转换回十六进制字符串
long value = 989231983928329832L
String hexString = Long.toHexString(value);
我们得到的十六进制字符串类似于“DBA753F8A80C668”,如果我们将其转换为字节数组,它将与上面的字节数组数据相同
那么,如何将上面的字节[]数据转换为十六进制字符串,如“DBA753F8A80C668”
是否有其他算法用于转换上面的字节[]数据并返回正确的长值,如98923198392832982L
======================================================================
复制的简单步骤:
您面临的问题是由于Java中的
long
类型是有符号的,因此您可以拥有的最大绝对值实际上是0x7fffffffffffff
,小于所需的0xDBA753F8A80C6608
您可以通过以下几种方式解决此问题:
- 使用
:biginger
biginger longValue=newbiginger(1,数据)代码>
- 如果您可以使用Java 8,那么可以使用
,正如@saka129的注释所指出的:unsigned long
long value=long.parseUnsignedLong(hexString.trim(),16)代码>
编辑:经过一些研究后,我警告您,第二种方法的输出在打印时将显示为负数。这是因为long变量仍然是有符号的,并且只有
long
类的一些方法被视为无符号的 您的字节数组不正确
byte[] data = new byte[]{(byte) 0xDB, (byte) 0xA7, 0x53, (byte) 0xF8, (byte) 0xA8, 0x0C, 0x66, 0x8};
long a = 989231983928329832L;
byte[] bytes = ByteBuffer.allocate(8).putLong(a).array();
for(int i = 0; i<8; i++){
System.out.printf("%02x\t%02x\n", data[i], bytes[i]);
}
System.out.println(Long.parseLong(hexStringFromHexData(bytes), 16));
byte[]data=newbyte[]{(byte)0xDB,(byte)0xA7,0x53,(byte)0xF8,(byte)0xA8,0x0C,0x66,0x8};
长a=989231983928329832L;
byte[]bytes=ByteBuffer.allocate(8).putLong(a).array();
对于(int i=0;我不明白您的问题是什么。这是某些值的NumberFormatException吗?此外,您的代码似乎正按照您所描述的那样执行。我无法转换该字节[]数据转换为long值,预期的long值为98923198392832982L,我们可以看到,如果将0x0C转换为字符串,则预期结果为0C;如果将0x8转换为字符串,则预期结果为8;如果将字节转换为0x0C==0xC以及0x8==0x08,则无法工作。您是如何获得该数组的?看起来像是将字节转换为byte[]
错误。十六进制字符串0xDBA753F8A80C6608超过了Long.MAX_值,对于98923198392832982L,十六进制字符串是0xDBA753F8A80C668,因此问题是我的十六进制字符串不正确。Long.MAX_值是2^63-1,即9223372036854775807L