繁体   English   中英

如何将字节数组转换为用于将其转换为long的十六进制字符串?

[英]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?

================================================== ====================

重现的简单步骤:

  1. 989231983928329832转换为byte []数据

  2. 将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

您可以通过多种方式解决此问题:

  • 使用BigIntegerBigInteger 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM