2009-06-19 68 views
0

我有一個SHA-1字節數組,我想在GET請求中使用。我需要對此進行編碼。 URLEncoder需要一個字符串,如果我創建一個字符串然後對它進行編碼,它會變壞嗎?Java編碼SHA-1字節陣列

爲了澄清,這有點跟隨我的另一個問題。 (Bitorrent Tracker Request)我可以將該值作爲十六進制字符串獲取,但不會被跟蹤器識別。另一方面,提供的編碼答案標記返回200 OK。

所以我需要的十六進制表示,我得到了轉換:

9a81333c1b16e4a83c10f3052c1590aadf5e2e20 

成編碼形式

%9A%813%3C%1B%16%E4%A8%3C%10%F3%05%2C%15%90%AA%DF%5E.%20 
+0

我已經編輯我的帖子,包括新的代碼來回答你的問題,編輯。 – BobMcGee 2009-06-19 21:02:11

回答

3

問題是編輯,以下是額外的代碼,並應工作(我的十六進制轉換碼):

//Inefficient, but functional, does not test if input is in hex charset, so somewhat unsafe 
//NOT tested, but should be functional 
public static String encodeURL(String hexString) throws Exception { 
    if(hexString==null || hexString.isEmpty()){ 
    return ""; 
    } 
    if(hexString.length()%2 != 0){ 
    throw new Exception("String is not hex, length NOT divisible by 2: "+hexString); 
    } 
    int len = hexString.length(); 
    char[] output = new char[len+len/2]; 
    int i=0; 
    int j=0; 
    while(i<len){ 
     output[j++]='%'; 
     output[j++]=hexString.charAt(i++); 
     output[j++]=hexString.charAt(i++); 
    } 
    return new String(output); 
} 

你需要的原始字節轉換爲十六進制字符或什麼他們正在使用的URL友好的編碼。 Base32或Base64編碼是可能的,但直接的十六進制字符是最常見的。該字符串不需要URLEncoder,因爲它不應包含任何需要URL編碼爲%NN格式的字符。

下面將轉換字節的哈希(SHA-1,MD5SUM等)爲十六進制字符串:

/** Lookup table: character for a half-byte */ 
    static final char[] CHAR_FOR_BYTE = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; 
     /** Encode byte data as a hex string... hex chars are UPPERCASE*/ 
     public static String encode(byte[] data){ 
      if(data == null || data.length==0){ 
       return ""; 
      } 
      char[] store = new char[data.length*2]; 
      for(int i=0; i<data.length; i++){ 
       final int val = (data[i]&0xFF); 
       final int charLoc=i<<1; 
       store[charLoc]=CHAR_FOR_BYTE[val>>>4]; 
       store[charLoc+1]=CHAR_FOR_BYTE[val&0x0F]; 
      } 
      return new String(store); 
     } 

這段代碼是相當優化,速度快,我用它爲自己的SHA -1字節編碼。請注意,您可能需要使用String.toLowerCase()方法將大寫字母轉換爲小寫字母,具體取決於服務器接受的格式。

0

這取決於你的請求的接收方預期。 我會想象它可能是你的哈希中的字節的十六進制表示。一個字符串可能不是最好的想法,因爲散列數組很可能包含不可打印的字符值。

我想迭代數組並使用Integer.toHexValue()將字節轉換爲十六進制。

0

SHA1是十六進制格式[0-9a-f],應該不需要URLEncode它。而我是在迴應

+0

SHA1不是以十六進制格式自動生成的。所有SHA1結果都是一個字節數組。你可以將這些字節編碼爲十六進制。 – Jherico 2009-06-19 20:55:37