2012-05-08 9 views
1

執行異或並將十六進制轉換爲字符串後,我期待十六進制值「89」顯示爲「‰」,但是Eclipse顯示「?」。在調試時,字符實際上是空白的。爲什麼?在Java中使用toString之後,爲什麼十六進制表示89不能正確打印爲‰?

  1. 我有我轉換爲十六進制=>「72」的字符串「r」。
  2. 然後我用「FB」(û)=>「89」來異或「72」。
  3. 然後我用這個函數轉換「89」字符串:「?」

    public static String HexToString(String hex){ 
        StringBuilder sb = new StringBuilder(); 
        StringBuilder temp = new StringBuilder(); 
    
        for(int i=0; i<hex.length()-1; i+=2){ 
    
         //grab the hex in pairs 
         String output = hex.substring(i, (i + 2)); 
    
         //convert hex to decimal 
         int decimal = Integer.parseInt(output, 16); 
    
         //convert the decimal to character 
         sb.append((char)decimal); 
    
         temp.append(decimal); 
        } 
        System.out.println("Decimal : " + temp.toString()); 
    
        return sb.toString(); 
        } 
    

打印結果到控制檯,我看到後代替 」‰」。哪裏不對?

編輯: 下面是一個截圖,顯示十進制值和(char)decimal的調試值。 (char)decimal

+0

@ D3mon這不會幫助;在'System.out.println'本身發生了奇怪的事情,而且我會爲此付出代價,因爲系統編碼是CP1252(或它的一個緊密兄弟),即它在Windows上。 –

回答

3

首先,Java在內部是完全的Unicode(儘管不是最新版本的Unicode,因爲複雜的原因在這裏不重要)。 89 hex將是\u0089這是一個擴展的控制字符(帶有對齊的字符表),就像在字符集ISO-8859-1中一樣;對於前256個字符,Unicode與ISO-8859-1完全相同。從你的描述中,我猜你在Windows上,並且已經配置了使用CP1252 character set的東西,它將89十六進制解釋爲,但是通過映射到等效字符完成了從Unicode轉換(在打印到控制檯期間),而不僅僅是將字節出;因爲C1控制字符在CP1252中沒有相同的地方,所以它最終成爲替換字符(在這種情況下是問號)。

這個故事的寓意是:字符字節,你在這方面的工作時需要非常小心的字符集。 (或者你應該使用一個完全的Unicode系統,這些問題在很大程度上消失,儘管以比以前更復雜的實體爲代價)。

+0

但是,我們如何改進上述代碼以獲得期望的結果? –

+1

@BhavikAmbani這是一個大錯特錯的事......但是使用'System.out.write(decimal);'來寫一個指定的字節而不用解釋。只要記住,你在這裏陷入了一個巨大的混亂。你在做什麼是不便攜的。你在做什麼並不高雅。你在做什麼是不好的做法。 –

+0

這是我正在參加的在線加密課程中的可選編程任務之一。問題的密碼都是十六進制的,我們必須得到密鑰(因爲它被用在多條消息上)才能解密消息。我們還應該如何從十六進制轉換爲字符串並返回?我們應該如何執行XOR?現在我正在做到十六進制值(它似乎工作正常)。另外,有沒有辦法在Eclipse中擴展字符集,以便打印功能顯示正確的字符? – rishimaharaj

相關問題