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

问题描述 投票:0回答:1

所以我有一段代码,它把二进制文件中的字节[]转换成int[],然后再转换成字符串。

例如:02 09 1A将翻译成 "2926",使用的是 String.valueOf(byte);

但这就是有趣的地方:旧的Code在数组变成String之前就已经把数组拆开了,所以这并不重要。现在,我的代码需要以某种方式找出是否有2 9或29... 我怎样才能让字符串--保持十六进制,而不是 "切换 "到十进制,并且--在字符串中保留零,这样我就可以随时抓住接下来的两个字符,找出它们显示的信息,然后继续?输入:05 06 1D 11 07 08 01 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的,而int是垃圾)

java string hex byte
1个回答
1
投票

如果我理解正确,你有一个 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 字节int 0xff. 这是必须的,因为Java的字节是有签名的。

另外,请注意我用 0. 只有当字节是十六进制的一位数时,我才会这样做。i < 16 是检查这个的条件。


1
投票

另一种方法。

  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
© www.soinside.com 2019 - 2024. All rights reserved.