Frage

Ich habe einen SHA-1-Byte-Array, das Ich mag würde in einer GET-Anforderung verwenden. Ich brauche dies zu kodieren. URLEncoder erwartet einen String, und wenn ich einen String davon erstellen und dann verschlüsseln, es beschädigt wird?

Um zu klären, ist dies ein bisschen auf eine andere Frage von mir folgen zu lassen. ( Bitorrent Tracker Anfrage ) Ich kann den Wert als Hex-String, aber das wird nicht durch die anerkannt Tracker. Auf der anderen Seite, codierte Antwort Zeichen versehen Rückkehr 200 OK.

Also brauche ich die Hex-Darstellung zu konvertieren, die ich habe:

9a81333c1b16e4a83c10f3052c1590aadf5e2e20

in kodierter Form

%9A%813%3C%1B%16%E4%A8%3C%10%F3%05%2C%15%90%AA%DF%5E.%20
War es hilfreich?

Lösung

Frage bearbeitet wurde, während ich reagiere, folgenden Zusatzcode und soll (mit meinem hex Conversion-Code) arbeiten:

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

Sie müssen das rohe Bytes hexadezimale Zeichen konvertieren oder was auch immer URL freundliche Codierung sie verwenden. Base32 oder Base64-Codierungen sind möglich, aber gerade hexadezimale Zeichen sind die häufigste. URLEncoder ist für diesen String benötigt, da es keine Zeichen enthalten soll, die URL-Kodierung auf% NN-Format erfordern würde.

Die unten konvertiert Bytes für einen Hash (SHA-1, MD5SUM, usw.) in eine hexadezimale string:

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

Dieser Code ist ziemlich optimiert und schnell, und ich benutze es für meine eigene SHA-1-Byte-Codierung. Beachten Sie, dass Sie benötigen, um in Großbuchstaben umwandeln mit dem String.toLowerCase () -Methode in Kleinbuchstaben, je nachdem, welche Form der Server akzeptiert.

Andere Tipps

Das hängt davon ab, was der Empfänger Ihrer Anfrage erwartet. Ich könnte mir vorstellen, es eine hexadezimale Darstellung des Bytes in Ihrem Hash sein könnte. Ein String würde wahrscheinlich nicht die beste Idee, da der Hash-Array höchstwahrscheinlich nicht-druckbare Zeichen Werte enthalten wird.

ich über das Array iterieren würde und verwenden Integer.toHexValue (), um das Bytes zu hex umwandeln.

SHA1 ist in Hex-Format [0-9a-f], sollte es keine Notwendigkeit, es zu urlencode.

Verwenden Sie Apache Commons-Codec für alle Ihre Kodierung / Dekodierung Bedürfnisse (außer ASN 0,1, die einen Schmerz im Arsch ist)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top