小写英文字符转换为16进制字符串再转为byte数组,在转回String时出现乱码
大佬帮忙看看是哪里出了问题,我把英文字符串每一个字符的ascii码转为16进制,然后再用new String(byte[])方法转回来,但是为什么大写的英文字符可以正常转换回来,小写的转换回来就是乱码呢?下面是全部代码:
public class Test {
public static void main(String[] args){
String s1 = "sunhaowei";
String s2 = convertDecimalToHex(asciiToDecimal(s1));
System.out.println(s2);
String s3 = "SUNHAOWEI";
String s4 = convertDecimalToHex(asciiToDecimal(s3));
System.out.println(s4);
byte[] b1 = hexStringToBytes(s2);
System.out.println(new String(b1));
byte[] b2 = hexStringToBytes(s4);
System.out.println(new String(b2));
}
/**
* 将16进制str转换为10进制格式的字符串
*
* 例如:
* 十六进制 120418
* 十进制 180424
*/
public static String convertHexToDecimal(String str) {
String hex = "";
String pattern = "%02d";
for(int i=0; i<str.length()/2; i++) {
hex += String.format(pattern,Integer.parseInt(str.substring(i*2,i*2+2),16));
}
return hex;
}
/**
* 将10进制str转换为16进制格式的字符串
*
* 例如:
* 十进制 180424
* 十六进制 120418
*/
public static String convertDecimalToHex(String str) {
String hex = "";
String pattern = "%02x";
for(int i=0; i<str.length()/2; i++) {
hex += String.format(pattern, Integer.valueOf(str.substring(i*2,i*2+2)));
}
return hex;
}
/**
* 将ASCII码转换为10进制str
*/
public static String asciiToDecimal(String value) {
StringBuffer sbu = new StringBuffer();
char[] ch = value.toCharArray();
for (int i = 0; i < ch.length; i++) {
sbu.append((int)ch[i]);
}
return sbu.toString();
}
public static byte[] hexStringToBytes(String hexString) {
if (hexString == null || hexString.equals("")) {
return null;
}
// toUpperCase将字符串中的所有字符转换为大写
hexString = hexString.toUpperCase();
int length = hexString.length() / 2;
// toCharArray将此字符串转换为一个新的字符数组。
char[] hexChars = hexString.toCharArray();
byte[] d = new byte[length];
for (int i = 0; i < length; i++) {
int pos = i * 2;
d[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1]));
}
return d;
}
//charToByte返回在指定字符的第一个发生的字符串中的索引,即返回匹配字符
public static byte charToByte(char c) {
return (byte) "0123456789ABCDEF".indexOf(c);
}
}