字符串轉16進制字符串
// 字符串轉換成為16進制(無需Unicode編碼)
public static String str2HexStr(String str) {
char[] chars = "0123456789ABCDEF".toCharArray();
StringBuilder sb = new StringBuilder(""); //String的getBytes()方法是得到一個操作系統默認的編碼格式的字節數組
byte[] bs = str.getBytes();
int bit;
for (int i = 0; i < bs.length; i++) {
bit = (bs[i] & 0x0f0) >> 4; // 高4位, 與操作 1111 0000
sb.append(chars[bit]);
bit = bs[i] & 0x0f; // 低四位, 與操作 0000 1111
sb.append(chars[bit]);
}
return sb.toString().trim();
}
16進制字符串轉字符串(漢字)
// 16進制直接轉換成為字符串(無需Unicode解碼)
public static String hexStr2Str(String hexStr) {
String str = "0123456789ABCDEF";
char[] hexs = hexStr.toCharArray();
byte[] bytes = new byte[hexStr.length() / 2]; //1個byte數值 -> 兩個16進制字符
int n;
for (int i = 0; i < bytes.length; i++) {
n = str.indexOf(hexs[2 * i]) * 16;
n += str.indexOf(hexs[2 * i + 1]);
// 保持二進制補碼的一致性 因為byte類型字符是8bit的 而int為32bit 會自動補齊高位1 所以與上0xFF之后可以保持高位一致性
//當byte要轉化為int的時候,高的24位必然會補1,這樣,其二進制補碼其實已經不一致了,&0xff可以將高的24位置為0,低8位保持原樣,這樣做的目的就是為了保證二進制數據的一致性。
bytes[i] = (byte) (n & 0xff);
}
return new String(bytes);
// return new String(bytes,"gb2312"); 轉換時指定,則解析時指定
}
編碼要一致
byte[] bs = str.getBytes("gb2312"); 也可以指定編碼格式,但是解析時也要指定相同的編碼格式,否則亂碼
return new String(bytes,"gb2312"); 轉換時指定,則解析時指定
byte[] bs = str.getBytes("UTF8"); 也可以指定編碼格式,但是解析時也要指定相同的編碼格式,否則亂碼
return new String(bytes,"UTF8"); 轉換時指定,則解析時指定
參考: https://www.cnblogs.com/kliine/p/9987512.html