[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]