如何在Java中将字节数组转换为十六进制格式

2022-09-04 05:02:39

我知道您可以使用,也可以使用将值转换为十六进制值并在控制台上显示它们。但是我希望能够实际格式化字节数组,以便每个字节都显示为十六进制而不是十进制。printfStringBuilder.append(String.format("%x", byte))

以下是我的代码的一部分,我已经完成了我所说的前两种方式:

if(bytes > 0)
    {
        byteArray = new byte[bytes]; // Set up array to receive these values.

        for(int i=0; i<bytes; i++)
        {
            byteString = hexSubString(hexString, offSet, CHARSPERBYTE, false); // Isolate digits for a single byte.
            Log.d("HEXSTRING", byteString);

            if(byteString.length() > 0)
            {
                byteArray[i] = (byte)Integer.parseInt(byteString, 16); // Parse value into binary data array.
            }
            else
            {
                System.out.println("String is empty!");
            }

            offSet += CHARSPERBYTE; // Set up for next word hex.    
        }

        StringBuilder sb = new StringBuilder();
        for(byte b : byteArray)
        {
            sb.append(String.format("%x", b));
        }

        byte subSystem = byteArray[0];
        byte highLevel = byteArray[1];
        byte lowLevel = byteArray[2];

        System.out.println("Byte array size: " + byteArray.length);
        System.out.printf("Byte 1: " + "%x", subSystem);
        System.out.printf("Byte 2: " + "%x", highLevel);
        System.out.println("Byte 3: " + lowLevel);
        System.out.println("Byte array value: " + Arrays.toString(byteArray));
        System.out.println("Byte array values as HEX: " + sb.toString());
    }
    else
    {
        byteArray = new byte[0]; // No hex data.

        //throw new HexException();
    }

    return byteArray;

拆分为字节数组的字符串为:

"1E2021345A2B"

但在控制台上将其显示为十进制,如下所示:

"303233529043"

任何人都可以帮助我如何使实际值以十六进制为单位并以这种方式自然显示。提前感谢您。


答案 1

您可以使用 String javax.xml.bind.DatatypeConverter.printHexBinary(byte[])。例如:

public static void main(String[] args) {
    byte[] array = new byte[] { 127, 15, 0 };
    String hex = DatatypeConverter.printHexBinary(array);
    System.out.println(hex); // prints "7F0F00"
}

答案 2

String.format实际上使用了java.util.Formatter类。不要使用 String.format 便利性方法,而是直接使用格式化程序:

Formatter formatter = new Formatter();
for (byte b : bytes) {
    formatter.format("%02x", b);
}
String hex = formatter.toString();

从Java 17开始,HexFormat可以在一行中完成此操作:

String hex = HexFormat.of().formatHex(bytes);