该.java文件包含两个函数。
-public static String bytes2HexString(byte[] srcBytes)
-public staticbyte[] hexString2Bytes(String hexString)
一、 public static String bytes2HexString(byte[] srcBytes)
/**
* 字节数组转十六进制字符串
* {1,15} --> "010f"
*
* @param srcBytes 字节数组
* @return
*/
public static String bytes2HexString(byte[] srcBytes) {
StringBuilder hexBuilder = new StringBuilder();
if (srcBytes != null) {
for (byte b : srcBytes) {
if ((b & 0xFF) > 15) {
// Integer.toHexString 转为字符串,但必须传入int类型,因此需要类型转换
hexBuilder.append(Integer.toHexString(b & 0xff));
} else {
hexBuilder.append(0).append(Integer.toHexString(b));
}
}
}
return hexBuilder.toString();
}
Q1.为什么用StringBuilder不用String类型?
String的值不可变,StringBuilder的值是可变的。String每赋予一个值,都会产生一个新的地址,而StringBuilder是在原有地址上一直更改的,节省了大量的空间,运行速度更快。
Q2. b & 0xFF是在干什么?
这个涉及到Java的类型转换。byte为1个字节(8位),int为4个字节(32位),使用b&0xFF的意思就是将byte型变量b扩展为int整型变量。可能会疑问,0xFF不也是8位吗?怎么能扩展呢?那是因为高位全是0省略了。实际这的0xFF就是一个32位的整型数。
首先是这个if判断 if ((b & 0xFF) > 15)。15为int类型(java默认一个常数就是int类型),b为byte,不能直接比较,必须转换才行。
其次是hexBuilder.append(Integer.toHexString(b & 0xff)); Integer.toHexString作用是转为字符串,但必须传入int类型(如下图所示),而b是byte类型,因此也需扩展为int才行。
(在Android Studio里面鼠标点中一个函数名,再按ctrl+B就可以看到他的实现)
二、 public static byte[] hexString2Bytes(String hexString)
见代码以及注释。
/**
* 十六进制字符串转字节数组
*
* @param hexString 十六进制字符串
* @return 字节数组
*/
public static byte[] hexString2Bytes(String hexString) {
// 新建一个byte数组,因为两个字符才能转为1个byte,所以长度只有hexString.length() / 2
byte[] bytes = new byte[hexString.length() / 2];
int j = 0;
for (int i = 0; i < bytes.length; i++) {
// Character.digit(string,radix) 为进制转换,
// 输入进制为radix的String,返回其对应的十进制数字
// charAt(index)为字符串取出s[index]
byte high = (byte) (Character.digit(hexString.charAt(j), 16) & 0xff); //字节数的高位
byte low = (byte) (Character.digit(hexString.charAt(j + 1), 16) & 0xff); //字节数的地位
bytes[i] = (byte) (high << 4 | low); //高位左移4位,在与低位异或得整个字节数
j += 2;
}
return bytes;
}