2013-09-27 181 views
0

我嘗試了將十六進制轉換爲字節的不同方法,代碼中有四種方法,其中三種我將其註釋掉,只有一種在運行時沒有錯誤,但我困惑的是,當我重複運行代碼時,它給了我不同的結果(應該生成「字節」)。用大字符串將十六進制轉換爲字節

有一個問題,當我使用「method1」,它給了我結果(字節),但是一旦我改變爲「method2」,它不會生成結果,我不知道爲什麼。我認爲它應該產生相同的結果,當我有相同的字符串。

public class Convert { 
/** 
* @param args 
* @throws IOException 
*/ 

// String everything; 

public static void main(String[] args) throws IOException { 
    //String everything; 
    // TODO Auto-generated method stub 
    BufferedReader br = null; 
    try { 
     br = new BufferedReader(new FileReader("C:\\TEMP1\\Doctor.txt")); 
    } catch (FileNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    try { 
     StringBuilder sb = new StringBuilder(); 
     String line = null; 
     try { 
      line = br.readLine(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     while (line != null) { 
      sb.append(line); 
      sb.append('\n'); 
      line = br.readLine(); 
     } 

     //*********Method 1**************** 
      //String r="1ee079746828d7c6f9af46f93c1ef2555ff4b14b2378ad53a258d18dc6a8363fb57f3448783833722bd9ef291ba53153afca31a96de404755e78f68b76fd5a77e4be3b984ea25244842e92a8ed40da1f1a588fb3da26b8bc21d74cd8476534f26ee454df086567c4d7cf3334f794cede41a9b051a5c393a35584afcf"; 
      //byte[] b = new BigInteger(r,16).toByteArray(); 
      //System.out.println("Byte for public key: "+b); 



     //*********Method 2**************** 
      //String r2 = sb.toString(); 
      //System.out.println("Doctor contect file: "+r2); 
      //byte[] b = new BigInteger(r2,16).toByteArray(); 
      //System.out.println("Byte for public key: "+b); 

     //********Method 3***************** 

      String r="1ee079746828d7c6f9af46f93c1ef2555ff4b14b2378ad53a258d18dc6a8363fb57f3448783833722bd9ef291ba53153afca31a96de404755e78f68b76fd5a77e4be3b984ea25244842e92a8ed40da1f1a588fb3da26b8bc21d74cd8476534f26ee454df086567c4d7cf3334f794cede41a9b051a5c393a35584afcf"; 
      int len = r.length(); 
      byte[] data = new byte[len/2]; 
      for (int i = 0; i < len; i += 2) { 
       data[i/2] = (byte) ((Character.digit(r.charAt(i), 16) << 4) 
           + Character.digit(r.charAt(i+1), 16)); 
       System.out.println(data); 
     } 


     //********Method4****************** 
     /* 
      String r2 = sb.toString(); 
      int len = r2.length(); 
      byte[] data = new byte[len/2]; 
      for (int i = 0; i < len; i += 2) { 
       data[i/2] = (byte) ((Character.digit(r2.charAt(i), 16) << 4) 
            + Character.digit(r2.charAt(i+1), 16)); 
       System.out.println(data); 
      } 
     */ 






     //String r=everything; 

     // String r="1ee079746828d7c6f9af46f93c1ef2555ff4b14b2378ad53a258d18dc6a8363fb57f3448783833722bd9ef291ba53153afca31a96de404755e78f68b76fd5a77e4be3b984ea25244842e92a8ed40da1f1a588fb3da26b8bc21d74cd8476534f26ee454df086567c4d7cf3334f794cede41a9b051a5c393a35584afcf"; 
     // double convert=Double.parseDouble(r); 
     // long convert=(long)(Integer.parseInt(r,32)&0xFF); 
     // byte convert=Byte.parseByte(r,32); 
     // byte convert=Integer.parseInt(everything,16); 
     // System.out.println("Byte for public key: "+convert); 

    } finally { 
     br.close(); 
    } 

} 

}

+1

除非這是作業,否則使用DatatypeConverter.parseHexBinary(yourhexstring);將十六進制字符串轉換爲字節數組。 – lreeder

+5

在您發佈的90行代碼中,只有7行與問題相關。請專注於下次只發布*相關*代碼。 –

回答

3

你打印一個byte[]調用toString的結果。這不會給你想要的。

出於診斷目的,請使用System.out.println(Arrays.toString(data))。而這樣做,在循環的結束而不是其中的:

for (int i = 0; i < len; i += 2) { 
    ... 
} 
System.out.println(Arrays.toString(data)); 

有大量的替代方法來解析十六進制字符串,請注意。當您不處理XML時,我個人不喜歡使用基於XML的API(如問題註釋中所建議的)的想法,但肯定會起作用 - 任何數量的第三方API都有十六進制轉換例程。

編輯:正如在評論中指出的,我相信你的十六進制轉換代碼是此刻破 - 但應該可以通過使用從其他地方預建的代碼來修復。這個答案的主要目的是解釋你爲什麼得到結果,如「[B @ 40a0dcd9」。一旦你可以看到的數據,你可以驗證它。

+0

我很確定他想要循環中的'data [ii/2]',看看它現在做了什麼。 –

+0

@AngeloNeuschitzer:是的,你可能是對的 - 但第一步是能夠看到實際產生的數據:)(目前它會產生一個看起來很糟糕的字符串,沒有什麼用處)。 –

+0

@JonSkeet - While DatatypeConverter是javax的一部分。xml包,它具有以下優點:1.它是JVM的標準部分 - 不需要任何第三方包。 2.它提供了一個將十六進制字符串轉換爲字節數組的單線程,AFAIK是標準庫中的唯一實用程序。 – lreeder

0

我不確定你爲什麼這樣做,所以這個答案可能不會反映你的意圖。

我試圖理解你的東西,並得出結論,你想將該字符串拆分成兩個字符塊,將它們視爲一個十六進制數字並將它們轉換爲一個字節。

這不會起作用,因爲第二塊e0大於Byte.MAX_VALUE。所以,繼承人我最新的猜測是什麼可能是你正在尋找的代碼(使用Integer)。

public static void main(String[] args) { 
    String r = "1ee079746828d7c6f9af46f93c1ef2555ff4b14b2378ad53a258d18dc6a8363fb57f3448783833722bd9ef291ba53153afca31a96de404755e78f68b76fd5a77e4be3b984ea25244842e92a8ed40da1f1a588fb3da26b8bc21d74cd8476534f26ee454df086567c4d7cf3334f794cede41a9b051a5c393a35584afcf"; 
    char[] rA = r.toCharArray(); 
    int len = r.length(); 
    int[] data = new int[len/2]; 

    for (int i = 0; i < len; i += 2) { 
     String base = "#" + rA[i] + rA[i+1]; 
     System.out.println("base: " + base); 
     data[i/2] = Integer.decode(base); 
     System.out.println(data[i/2]); 
    } 
} 
+0

嗨安傑洛,感謝您的幫助,但我真的必須將其轉換爲字節。 – user2141529

0

再次閱讀您的問題後,似乎你的描述,當您使用String直接(method1)它的工作原理,但如果你從一個文件(method2)閱讀,如果它不。

原因很簡單:在從文件讀取的字符串末尾添加\n。你不這樣做你的method1

+0

您是否知道我可以刪除\ n一旦我讀取文件? – user2141529

+0

你追加它。手動。在這一行中:'sb.append('\ n');' –

相關問題