/** * 16進制直接轉換成爲字符串 * @explain * @param hexStr 16進制字符串 * @return String (字符集:UTF-8) */ public static String fromHexString(String hexString) throws Exception { // 用於接收轉換結果 String result = ""; // 轉大寫 hexString = hexString.toUpperCase(); // 16進制字符 String hexDigital = "0123456789ABCDEF"; // 將16進制字符串轉換成char數組 char[] hexs = hexString.toCharArray(); // 能被16整除,確定能夠被2整除 byte[] bytes = new byte[hexString.length() / 2]; int n; for (int i = 0; i < bytes.length; i++) { n = hexDigital.indexOf(hexs[2 * i]) * 16 + hexDigital.indexOf(hexs[2 * i + 1]); bytes[i] = (byte) (n & 0xff); } // byte[]-->String result = new String(bytes, "UTF-8"); return result; }
/** * 字符串轉換成爲16進制字符串(大寫) * @explain 由於java轉義字符串在java中有着特殊的意義, * 因此當字符串中包含轉義字符串,並將其轉換成16進制後,16進制再轉成String時,會出問題: * java會將其當作轉義字符串所表明的含義解析出來 * @param str 字符串(去除java轉義字符) * @return 16進制字符串 * @throws Exception */ public static String toHexString(String str) throws Exception { // 用於接收轉換結果 String hexString = ""; // 1.校驗是否包含特殊字符內容 // java特殊轉義符 // String[] escapeArray = {"\b","\t","\n","\f","\r","\'","\"","\\"}; String[] escapeArray = {"\b","\t","\n","\f","\r"}; // 用於校驗參數是否包含特殊轉義符 boolean flag = false; // 迭代 for (String esacapeStr : escapeArray) { // 一真則真 if (str.contains(esacapeStr)) { flag = true; break;// 終止循環 } } // 包含特殊字符 if (flag) throw new Exception("參數字符串不能包含轉義字符!"); // 16進制字符 char[] hexArray = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; StringBuilder sb = new StringBuilder(); // String-->byte[] byte[] bs = str.getBytes(); int bit; for (int i = 0; i < bs.length; i++) { bit = (bs[i] & 0x0f0) >> 4; sb.append(hexArray[bit]); bit = bs[i] & 0x0f; sb.append(hexArray[bit]); } hexString = sb.toString(); return hexString; }
/** * * @explain * @param args * @throws Exception */ public static void main(String[] args) throws Exception { // 其中,\'\"\\ 實際字符串表明:'"\ String str = "張三&$李四((、,//\'\"\\‘’「」+-*/!!~.。=——??;;"; String hexStr = toHexString(str); System.out.println(hexStr); System.out.println(fromHexString(hexStr)); }
要想將特殊轉義符看成字符串來正常解析,須要本身再手動進行轉義,好比:html
// 輸出\\ String str = "\\\\"; String hexStr = toHexString(str); System.out.println(hexStr); System.out.println(fromHexString(hexStr)); // 輸出\n str = "\\n"; hexStr = toHexString(str); System.out.println(hexStr); System.out.println(fromHexString(hexStr));
toHexString()方法中,調用的contains(param)方法,不須要轉義,而是將param看成純字符串來解析,因此能校驗經過!java