Java 如何将字节数组转换为十六进制字符串,并将其转换为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[]转换为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”

用这个十六进制字符串,我把它转换成下面的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

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

复制的简单步骤:

  • 989231983928329832将其转换为字节[]数据

  • 将字节[]数据转换回长值98923198392832982L


  • 您面临的问题是由于Java中的
    long
    类型是有符号的,因此您可以拥有的最大绝对值实际上是
    0x7fffffffffffff
    ,小于所需的
    0xDBA753F8A80C6608

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

    • 使用
      biginger
      biginger longValue=newbiginger(1,数据)

    • 如果您可以使用Java 8,那么可以使用
      unsigned long
      ,正如@saka129的注释所指出的:
      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