1

GETリクエストで使用したいSHA-1バイト配列があります。これをエンコードする必要があります。URLEncoder文字列が必要ですが、文字列を作成してからエンコードすると、破損しますか?

明確にするために、これは私の別の質問へのフォローアップです。(Bitorrent Tracker Request)値を16進文字列として取得できますが、それはトラッカーによって認識されません。一方、提供されたエンコードされた回答マークは200OKを返します。

したがって、取得した16進表現を変換する必要があります。

9a81333c1b16e4a83c10f3052c1590aadf5e2e20

エンコードされた形式に

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

4 に答える 4

3

質問は私が応答している間に編集されました、以下は追加のコードであり、(私の16進変換コードで)動作するはずです:

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

生のバイトを16進文字、または使用しているURLに適したエンコーディングに変換する必要があります。Base32またはBase64エンコーディングが可能ですが、最も一般的なのは16進文字です。この文字列にはURLEncoderは必要ありません。これは、%NN形式へのURLエンコードを必要とする文字を含めるべきではないためです。

以下は、ハッシュ(SHA-1、MD5SUMなど)のバイトを16進文字列に変換します。

/** 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()メソッドを使用して大文字を小文字に変換する必要がある場合があることに注意してください。

于 2009-06-19T20:43:08.617 に答える
0

これは、リクエストの受信者が何を期待しているかによって異なります。ハッシュ内のバイトの16進表現である可能性があると思います。ハッシュ配列には印刷できない文字値が含まれている可能性が高いため、文字列はおそらく最善のアイデアではありません。

配列を反復処理し、Integer.toHexValue()を使用してバイトを16進数に変換します。

于 2009-06-19T20:23:47.297 に答える
0

SHA1は16進形式[0-9a-f]であるため、URLエンコードする必要はありません。

于 2009-06-19T20:24:56.717 に答える
0

Apache Commons-Codecをすべてのエンコード/デコードのニーズに使用します(お尻の痛みであるASN.1を除く)

于 2009-06-20T01:14:33.200 に答える