Java基礎-02 字符串(漢字)與16進制字符串轉換(無亂碼)


字符串轉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


免責聲明!

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



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