質問

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

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

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

9a81333c1b16e4a83c10f3052c1590aadf5e2e20

エンコードされたフォームへ

%9A%813%3C%1B%16%E4%A8%3C%10%F3%05%2C%15%90%AA%DF%5E.%20
役に立ちましたか?

解決

質問が応答中に編集されました。以下は追加のコードであり、動作するはずです(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()メソッドを使用して大文字を小文字に変換する必要がある場合があることに注意してください。

他のヒント

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

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

SHA1は16進形式[0-9a-f]であるため、URLEncodeする必要はありません。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top