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