求java 关于 RSA 的byte数组转换十六进制的问题
1.关于这段bytesToHexStr方法byte数组转换十六进制疑问是为什么要进行bcd.length * 2 有什么含义吗
2.bytesToHexStr方法和 bytesToHexStr2方法有什么区别
由于对位操作不是很了解,希望大侠求解
3.有个疑问就是java难道没有封装好的API直接通过byte数组转换成16进制返回String的方法吗,如果有麻烦把代码怎么实现,谢谢
public static final String bytesToHexStr(byte[] bcd) {
StringBuffer s = new StringBuffer(bcd.length * 2);
for (int i = 0; i < bcd.length; i++) {
s.append(bcdLookup[(bcd[i] >>> 4) & 0x0f]);
s.append(bcdLookup[bcd[i] & 0x0f]);
}
return s.toString();
}
private static final char[] bcdLookup = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D',
'E', 'F' };
//字节转化为十六进制字符串
public String bytesToHexStr2(byte[] bcd) {
String s ="";
for (int i = 0; i < bcd.Length; i++) {
s +=(bcdLookup[(((byte)bcd[i]) >> 4) & 0 x0f]);
s+=(bcdLookup[(byte)bcd[i] & 0 x0f]);
}
return s;
}
--------------------编程问答-------------------- 1.byte的取值范围是-128~127.无符号化之后是0~255,转成16进制字符的时候,每个字节对应2个字符。因此要×2
2.2个方法的区别在于对字符串的处理上。对于字符串的连接,最好是使用StringBuffer or StringBuilder,而不是直接使用字符串相加,以避免运算过程中产生过多的临时字符串对象
方法一,只在最后生成一个字符串对象,之前都是对一个StringBuffer对象的操作
方法二,你每处理一个字符,就会生成好几个字符串对象
3.java API里有提供单个byte or int数值,转为16进制字符串的API,但是基于第二条的原因,就算你调用这些方法,一样不可避免要生成中间的临时字符串对象 --------------------编程问答-------------------- 1、你的for循环里面,append了两次,所以s的长度为bcd.length * 2。(其实StringBuffer不这样严格定义也无所谓。)
2、bytesToHexStr方法和 bytesToHexStr2方法实现的功能一样。不过bytesToHexStr方法更有效率一些。
其实关键是bcd[i] >>> 4) & 0x0f;bcd[i] & 0x0f;前者取得了bcd[i]的高4位,后者取得了低四位。
补充:Java , Java SE