如何将字节转换为显示其十六进制值的字符串 (0x0e -> "0E")

How to convert a byte into a String that displays its hex value (0x0e -> "0E")

所以我有一段代码,它将 byte[] 从二进制文件转换为 int[],然后再将其转换为 String。

示例:02 09 1A 将使用 String.valueOf(byte);

转换为“2926”

但这就是有趣的开始:旧代码在数组变成字符串之前就已经拆分了数组,所以这无关紧要。现在我有代码需要以某种方式弄清楚是否有 2 9 或 29...我怎样才能得到字符串
- 保持十六进制而不是 "switching" 到十进制和
- 保留字符串中的零
这样我就可以随时抓住接下来的两个字符,找出它们显示的信息并继续?

输入:
05 06 1D 11 07 08 01 32 21 28 2F 20 2E 21 34 22 25 33 01 02 09 0A FF 0B 0C
2!(/ .!4"%3 ÿ
当前输出:562917781503340473246335234375112910-11112
预期输出:05061D110708013221282F202E21342225330102090AFF0B0C

(没有把我的旧代码放在这里,因为它基于 int 是废话)

如果我没理解错的话,你有一个 byte[] 作为输入,你想输出一个由所有这些字节组成的字符串,以十六进制形式连接在一起:

private static String byteArrayToString(byte[] byteArray) {
    StringBuilder builder = new StringBuilder();
    for (byte b : byteArray) {
        int i = Byte.toUnsignedInt(b);
        if (i < 16) {
            builder.append("0");
        }
        builder.append(Integer.toHexString(i).toUpperCase());
    }
    return builder.toString();
}

注意 Byte.toUnsignedInt 的用法。这会将 -1 byte 之类的东西转换为 int 0xff。这是必需的,因为 Java 的字节已签名。

还要注意我用 0 填充的地方。我只在字节是十六进制的单个数字时才这样做。 i < 16 是检查这个的条件。

另一种方式:

  char[] hexVals = {'0', '1','2','3','4','5','6','7','8','9','A', 'B','C','D','E','F'};
  byte[] bytes = {5, 6, (byte)0xAB, (byte)0xde};   // sample input
  char[] output = new char[bytes.length*2];
  // split each byte's hex digits into two chars
  for(int i=0; i < bytes.length; i++) {
     output[2*i] = hexVals[(bytes[i] >> 4) & 0xf];  // HO nibble
     output[2*i+1] = hexVals[bytes[i] & 0xf];       // LO nibble
  }
  System.out.println(new String(output)); //  0506ABDE