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

Posted

技术标签:

【中文标题】如何在Java中将字节数组转换为十六进制格式【英文标题】:How to convert byte array to hex format in Java 【发布时间】:2013-10-27 08:15:13 【问题描述】:

我知道您可以使用printf 也可以使用StringBuilder.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"

谁能帮助我了解如何将实际值设为十六进制并以这种方式自然显示。提前谢谢你。

【问题讨论】:

你为什么不直接调用 Integer.parseInt(sb.toString(), 16) ? 【参考方案1】:

我的做法:

  private static final char[] HEX_CHARS =  '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A',
      'B', 'C', 'D', 'E', 'F' ;

  public static String toHexString(byte[] bytes) 
    char[] hexChars = new char[bytes.length * 2];
    int v;
    for (int j = 0; j < bytes.length; j++) 
      v = bytes[j] & 0xFF;
      hexChars[j * 2] = HEX_CHARS[v >>> 4];
      hexChars[j * 2 + 1] = HEX_CHARS[v & 0x0F];
    
    return new String(hexChars);
  

【讨论】:

我仍然想返回一个字节数组,尽管每个字节都已格式化为十六进制。例如字符串是 1E,字节现在是十进制的 30,我希望将字节格式化回 1E。有没有办法做到这一点? 它需要两个 HEX 字符来“描述”1 个字节。如果使用十六进制字符的 ASCII 代码对十六进制字符进行编码,则可以使用 1 个字节表示 1 个十六进制字符。因此,您需要两个字节来用 ASCII 十六进制来描述一个字节。我不确定你真正想要什么。 我想让两个字符占据 1 个单字节。因此,对于我的示例,我有一个 6 字节数组。 您应该了解字节、数字系统、字符及其以位为单位的编码,称为“字符编码”。默认情况下,ascii 字符使用 1 个字节(8 位)进行编码。十六进制是一个数字系统,其中每个数字都可以从 0 到 F。这个数字可以用一个 ascii 字符表示。您需要两个十六进制数字来描述一个字节(8 位)。如果要使用 ascii 字符显示这两个数字,则需要两个字符,因此需要两个字节。 这正是数字系统之间的转换:youtube.com/watch?v=Fpm-E5v6ddc【参考方案2】:

您可以使用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"

【讨论】:

我使用的是 android Java,Android 不支持这个。有没有其他方法可以解决这个问题? 我找到的任何其他方式中最短的方式。 VGR 的答案也适用于 Android,而且要简单得多。 @JamesMeade 对于Android,请参阅VGR's solution。 业务应用程序的最佳答案,其中 javax.xml.bind.DatatypeConverter 通常可用【参考方案3】:

String.format 实际上使用了 java.util.Formatter 类。不要使用 String.format 便捷方法,而是直接使用 Formatter:

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);

【讨论】:

这是我能找到的不依赖非标准库的最短、最简单的答案。非常棒!!! 迄今为止最干净的解决方案。谢谢!值得一提的是,您可以将x 大写并在其后添加一个空格以使其看起来更具可读性 如果最后一个字节小于 16,是否填充零? @ConstanceEustace %02x 中的 0 表示“如果有必要用零填充以保证有两位数字。”来自 the documentation:“如果给出了 '0' 标志,则输出将在基数指示符或符号(如果存在)之后用前导零填充到字段宽度。”【参考方案4】:

试试这个

byte[] raw = some_bytes;
javax.xml.bind.DatatypeConverter.printHexBinary(raw)

【讨论】:

以上是关于如何在Java中将字节数组转换为十六进制格式的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C 中将字节数组转换为十六进制字符串?

如何在 Visual C++ 中将字节数组转换为十六进制字符串?

在 C++ 中将十六进制字符串转换为字节数组

如何将Mac地址转换为十六进制并将其传递给java中的字节数组

在 C 中将 int 转换为 2 字节的十六进制值

如何在java中将字节数组转换为hexString? [复制]