我在回复时编辑了问题,以下是附加代码,应该可以工作(使用我的十六进制转换代码):
//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);
}
您需要将原始字节转换为十六进制字符或它们使用的任何 URL 友好编码。Base32 或 Base64 编码是可能的,但直接的十六进制字符是最常见的。此字符串不需要 URLEncoder,因为它不应包含任何需要将 URL 编码为 %NN 格式的字符。
下面会将散列(SHA-1、MD5SUM 等)的字节转换为十六进制字符串:
/** 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() 方法将大写转换为小写,具体取决于服务器接受的格式。