[英]How to convert byte array to hex string which it is using for convert it to long?
我尝试将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){
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”
用那个十六进制字符串,我将其转换为如下长
String hexstring = "dba753f8a80c6608";
Long value = Long.parseLong(hexString.trim(), 16);
因为十六进制字符串超过7fffffffffffffff(Long.MAX_VALUE),所以将引发NumberFormatException。
正确的十六进制字符串必须像这样的“ DBA753F8A80C668”,并且使用此十六进制字符串可以将其转换为此长值989231983928329832L,而不会出现异常。
我们可以尝试将此long值转换回十六进制字符串
long value = 989231983928329832L
String hexString = Long.toHexString(value);
我们得到了像“ DBA753F8A80C668”这样的十六进制字符串,如果我们将其转换为字节数组,它将与上述字节数组数据相同。
那么,如何将上面的byte []数据转换为十六进制字符串,例如“ DBA753F8A80C668”?
是否有其他算法可以转换上面的byte []数据并返回正确的long值,例如989231983928329832L?
================================================== ====================
重现的简单步骤:
989231983928329832转换为byte []数据
将byte []数据转换回长值989231983928329832L
您的字节数组不正确。
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));
哪个输出。
db 0d
a7坝
53 75
f8 3f
a8 8a
0分80
66 c6
08 68
989231983928329832
第一列是您的字节数组,第二列是创建的字节数组。 您还可以看到您的字符串技术适用于正确的字节数组。
您面临的问题是由于Java中的long
类型是带符号的,因此您可以拥有的最大绝对值确实为0x7fffffffffffffff
,小于所需的0xDBA753F8A80C6608
。
您可以通过多种方式解决此问题:
使用BigInteger
: BigInteger longValue = new BigInteger(1, data);
如果您可以使用Java 8,则可以使用unsigned long
,如@ saka1029的注释中指出的: long value = Long.parseUnsignedLong(hexString.trim(), 16);
编辑:经过一些研究,我警告您,如果打印第二种方法的输出将显示为负数。 这是由于long变量仍然是带符号的,并且Long
类仅将某些方法视为无符号。 这是我使用的来源
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.