java 16進制與字符串直接相互轉換


java 16進制與字符串直接相互轉換

CreationTime--2018年7月12日09點39分

Author:Marydon

1.16進制轉換成字符串

/**
 * 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;
}  

2.字符串轉換成大寫的16進制字符串

/**
 * 字符串轉換成為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;
}  

3.測試

/**
 *
 * @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));
}

4.說明

  要想將特殊轉義符當作字符串來正常解析,需要自己再手動進行轉義,比如:

// 輸出\\
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當作純字符串來解析,所以能校驗通過!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM