有的时候需要把十六机制的字符串,转换为相应的字节数组,或者反过来。
此处指的不是字符串转换为字节,而是"长得一样"的字节。
比如字符串“012F”转换为字节数组,存储的内容是0x01 0x2F ,就是肉眼看着的内容是不变的。
那么如何把字符串形式的十六进制,转换为字节数组呢?
可以手工实现(参见下面的hexStringToByteArray )
如果不是非要自己手写代码的话,可以借助于guava包实现。
BaseEncoding.base16().decode BaseEncoding.base16().encode
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);
}
/**
* 转换方法
*
* @param s
* @return
*/
public static byte[] hexStringToByteArray(String s) {
int len = s.length();
byte[] data = new byte[len / 2];
for (int i = 0; i < len; i += 2) {
data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
+ Character.digit(s.charAt(i + 1), 16));
}
return data;
}
/**
* 字节转十六进制打印
*
* @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();
}
转载务必注明出处:程序员潇然,疯狂的字节X,https://crazybytex.com/thread-87-1-1.html |