2009-06-19 6 views
0

J'ai un tableau d'octets SHA-1 que je voudrais utiliser dans une requête GET. J'ai besoin de coder ceci. URLEncoder attend une chaîne, et si je crée une chaîne de celui-ci, puis l'encoder, il est corrompu?Java Encode SHA-1 Byte Array

Pour clarifier, c'est un peu une suite à une autre de mes questions. (Bitorrent Tracker Request) Je peux obtenir la valeur en tant que chaîne hexadécimale, mais cela n'est pas reconnu par le tracker. D'un autre côté, la marque de réponse codée fournie renvoie 200 OK.

donc je dois convertir la représentation hexagonale que je suis:

9a81333c1b16e4a83c10f3052c1590aadf5e2e20 

sous forme codée

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

J'ai édité mon post pour inclure un nouveau code pour répondre à votre question éditée. – BobMcGee

Répondre

3

Question a été modifiée alors que je répondais, suivant est un code supplémentaire et devrait fonctionner (avec mon code de conversion hexadécimal):

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

Vous aurez besoin de convertir les octets bruts en caractères hexadécimaux ou autre Encodage URL-friendly qu'ils utilisent. Les encodages Base32 ou Base64 sont possibles, mais les caractères hexadécimaux droits sont les plus courants. URLEncoder n'est pas nécessaire pour cette chaîne, car elle ne doit contenir aucun caractère nécessitant le codage de l'URL au format% NN.

Le ci-dessous vous permet de convertir octets pour un hachage (SHA-1, MD5SUM, etc.) à une chaîne hexadécimale:

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

Ce code est assez optimisé et rapide, et je l'utilise pour mon propre SHA -1 octet d'encodage. Notez que vous devrez peut-être convertir les majuscules en minuscules avec la méthode String.toLowerCase(), selon la forme acceptée par le serveur.

0

Cela dépend de ce que le destinataire de votre demande attend. J'imagine que cela pourrait être une représentation hexadécimale des octets dans votre hachage. Une chaîne ne serait probablement pas la meilleure idée, car le tableau de hachage contiendra probablement des valeurs de caractères non imprimables.

Je parcourais le tableau et utilisais Integer.toHexValue() pour convertir les octets en hexadécimal.

0

SHA1 est au format hexadécimal [0-9a-f], il ne devrait pas être nécessaire de le code URLEncode.

+0

SHA1 n'est pas automatiquement au format hexadécimal. Tous les résultats SHA1 est un tableau d'octets. Vous pouvez encoder ces octets en hexadécimal. – Jherico