最近遇到一个需求:一个按钮和一个输入框,在输入框中输入字符串,通过点击按钮,将输入框中的文字在十六进制字符串和原意字符串之间切换。
这时需要字节数组:因为不论是十六进制字符串还是原意字符串,他们的字节数组是相同的。所以我先将原意字符串转换成字节数组,当点击切换的时候,将字节数组转成十六进制字符串。
四个方法:
1。原意字符串转字节数组:string.getBytes()
2。十六进制转字节数组:
public static byte charToByte(char c) {
return (byte) "0123456789ABCDEF".indexOf(c);
}
//Convert hex string to byte[]
public static byte[] hexStringToBytes(String hexString) {
if (hexString == null || hexString.equals("")) {
return null;
}
String string = hexString.replace(" ", "");
string = string.toUpperCase();
int length = string.length() / 2;
char[] hexChars = string.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;
}
3。字节数组转原意字符串 new String(bytes);
在这遇到一问题:我先用 的是toString方法,但是切换后会不断改变。
原来:一个对象toString()方法如果没有被重写,那么默认调用它的父类Object的toString()方法,而Object的toString()方法是打印该对象的hashCode,一般hashCode就是此对象的内存地址!而new String()返回的是当前对象的地址,打印的是字符串。
4。字节数组转十六进制字符串:
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);
}
return stringBuilder.toString().toUpperCase();
}