Question

Je souhaite utiliser un tableau d'octets SHA-1 dans une requête GET. J'ai besoin d'encoder ceci. URLEncoder attend une chaîne, et si je crée une chaîne de cette chaîne puis la code, elle sera corrompue?

Pour clarifier, c’est un peu la suite d’une autre question. ( demande de suivi Bitorrent ) Je peux obtenir la valeur sous forme de chaîne hexagonale, mais elle n'est pas reconnue par traqueur. De plus, le repère corrigé fournit 200 OK.

Il me faut donc convertir la représentation hexadécimale que j'ai obtenue:

9a81333c1b16e4a83c10f3052c1590aadf5e2e20

sous forme codée

%9A%813%3C%1B%16%E4%A8%3C%10%F3%05%2C%15%90%AA%DF%5E.%20
Était-ce utile?

La solution

La question a été modifiée pendant ma réponse. Voici un code supplémentaire qui 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 devrez convertir les octets bruts en caractères hexadécimaux ou en tout autre codage convivial utilisé par les URL. Les codages Base32 ou Base64 sont possibles, mais les caractères hexadécimaux simples sont les plus courants. URLEncoder n'est pas nécessaire pour cette chaîne, car elle ne devrait contenir aucun caractère nécessitant un encodage d'URL au format% NN.

Le texte ci-dessous convertit les octets d'un hachage (SHA-1, MD5SUM, etc.) en 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 codage SHA-1 octet. 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.

Autres conseils

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 de votre hachage. Une chaîne ne serait probablement pas la meilleure idée, car le tableau de hachage contiendra probablement des valeurs de caractère non imprimables.

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

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

Utilisez le Apache Commons-Codec pour tous vos besoins d'encodage / décodage (sauf l'ASN). .1, qui est une douleur dans le cul)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top