应用场景:一般的java报文加密中,例如des对称加密、md5签名,返回的都是字节数组,想要加密后的数据能被明文显示,一般将字节数组转换为16进制字符串
private static void test7() {
String str = "中国";
byte[] strArray = str.getBytes();
System.out.println("strArray: " + Arrays.toString(strArray));
StringBuffer sb = new StringBuffer();
for(byte b : strArray){
String s = Integer.toHexString(b&0xff);
if(s.length()==1) s = "0" + s;
sb.append(s);
}
System.out.println("sb: " + sb);
char[] chs = sb.toString().toCharArray();
int len = chs.length/2;
byte[] bs = new byte[len];
for(int i=0; i<len; i++){
int pos = i*2;
bs[i] = (byte)((byte)"0123456789abcdef".indexOf(chs[pos])<<4 | (byte)"0123456789abcdef".indexOf(chs[pos+1]));
}
System.out.println("bs: "+Arrays.toString(bs));
}
结果:
strArray: [-28, -72, -83, -27, -101, -67]
sb: e4b8ade59bbd
bs: [-28, -72, -83, -27, -101, -67]
byte转int,为啥需要&0xFF?
byte为8位,int为32位,与上0xFF将前面多余的24位舍去,保证数据的正确
一个字节对应两个16进制字符串,byte的高低四位对应16进制字符串
java中的负数是以补码的形式存放的,一个byte8位,最左边一位为符号位,范围-127到128
正数的反码和补码都是其本身,负数的反码:符号位不便,其它位取反;负数的补码:符号位不变,其他位取反加一
-1
原码:10000001
反码:11111110
补码:11111111
转载请注明原文地址: https://ju.6miu.com/read-963400.html