一.代码
/*** Convert byte[] to hex string
*
*@paramsrc byte[] data
*@returnhex string*/
public static String bytesToHexString(byte[] src){
StringBuilder stringBuilder= new StringBuilder("");if (src == null || src.length <= 0) {return null;
}for (int i = 0; i < src.length; i++) {int v = src[i] & 0xFF;
String hv=Integer.toHexString(v);if (hv.length() < 2) {
stringBuilder.append(0);
}
stringBuilder.append(hv);
}returnstringBuilder.toString();
}
二.解析
/*** 补码*/
public static voidcomplement(){byte a=-1;
System.out.println("-1 hex : 0x"+Integer.toHexString(a));
System.out.println("-1&0xff : 0x"+Integer.toHexString(a&0xff));
System.out.println("-1 bin : "+Integer.toBinaryString(a));
System.out.println("-1&0xff bin: "+ Integer.toBinaryString(a&0xff));System.out.println("127 bin : "+ Integer.toBinaryString(127));
System.out.println("-128 bin : "+ Integer.toBinaryString(-128));
}
Java的二进制采用补码形式,byte范围是[-128, 127],而Integer.toHexString的参数是int,如果不进行&0xff,那么当一个byte会转换成int时,对于负数,会做位扩展,
举例来说,一个byte类型的-1(即0xff),会被转换成int 类型的-1(即0xffffffff),那么转化出的结果就不是我们想要的了。
-1 hex : 0xffffffff
-1&0xff : 0xff
-1 bin : 11111111111111111111111111111111
-1&0xff bin: 11111111
127 bin : 1111111
-128 bin : 11111111111111111111111110000000
三。将十六进制字符串存为字节数组,可以节省存储空间
0499AFA3432E9F2EBD81C134C1F5E4B3(MD5串)
如果把这个MD5串直接存为字符串,就是32个字节(byte),就是256二进制位。
如果把MD5串的每个字符用16进制字符来表示,那么用二进制位就会表示成4个二进制位,总共是128位,也就是16个字节。那么节省了一半的存储空间。
四。在定义int类型的变量时,使用十六进制表示有什么好处?
int a = 0b11000011001111001100011100101000
还是这样好?
1100 0011 0011 1100 1100 0111 0010 1000
int a = 0xC33CC728
参考: