程序员潇然 发表于 2022-7-19 16:53:55

[java][guava] 字符串形式十六进制字符串与字节数组的转换

有的时候需要把十六机制的字符串,转换为相应的字节数组,或者反过来。

此处指的不是字符串转换为字节,而是"长得一样"的字节。

比如字符串“012F”转换为字节数组,存储的内容是`0x01` `0x2F`,就是肉眼看着的内容是不变的。

那么如何把字符串形式的十六进制,转换为字节数组呢?

可以手工实现(参见下面的`hexStringToByteArray`)
如果不是非要自己手写代码的话,可以借助于guava包实现。

`BaseEncoding.base16().decode``BaseEncoding.base16().encode`

!(data/attachment/forum/202207/19/164846fntrzaq3ww11wpxr.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")

```java
public static void main(String[] args) {
      //打印guava解码后的字节数组
      System.out.println(bytes2hex(BaseEncoding.base16().decode("012F")));
      //打印自定义方法解码后的字节数组
      System.out.println(bytes2hex(hexStringToByteArray("012F")));
      //将字符串解码为字节,然后再把对应的字节进行编码成字符串
      String string = BaseEncoding.base16().encode(BaseEncoding.base16().decode("012F"));
      System.out.println(string);

    }
```

!(data/attachment/forum/202207/19/170025s2onaobn2ki74qdw.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")

```java
/**
   * 转换方法
   *
   * @param s
   * @return
   */
    public static byte[] hexStringToByteArray(String s) {
      int len = s.length();
      byte[] data = new byte;
      for (int i = 0; i < len; i += 2) {
            data = (byte) ((Character.digit(s.charAt(i), 16) << 4)
                  + Character.digit(s.charAt(i + 1), 16));
      }
      return data;
    }
```

```java
/**
   * 字节转十六进制打印
   *
   * @param bytes
   * @return
   */
    public static String bytes2hex(byte[] bytes) {
      StringBuilder sb = new StringBuilder();
      String tmp;
      sb.append("[");
      for (byte b : bytes) {
            // 将每个字节与0xFF进行与运算,然后转化为10进制,然后借助于Integer再转化为16进制
            tmp = Integer.toHexString(0xFF & b);
            if (tmp.length() == 1) {
                //只有一位的前面补个0
                tmp = "0" + tmp;
            }
            //每个字节用空格断开
            sb.append(tmp).append(" ");
      }
      //删除最后一个字节后面对于的空格
      sb.delete(sb.length() - 1, sb.length());
      sb.append("]");
      return sb.toString();
    }
```

!(data/attachment/forum/202206/16/141330jha7st9soow8772i.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "common_log.png")
`转载务必注明出处:程序员潇然,疯狂的字节X,https://crazybytex.com/thread-87-1-1.html `
页: [1]
查看完整版本: [java][guava] 字符串形式十六进制字符串与字节数组的转换