Java编码SHA-1字节数组

Java编码SHA-1字节数组,java,encode,sha,Java,Encode,Sha,我有一个SHA-1字节数组,我想在GET请求中使用它。我需要对这个进行编码URLEncoder需要一个字符串,如果我创建一个字符串,然后对其进行编码,它会损坏吗 澄清一下,这是我另一个问题的后续行动。 ()我可以获取十六进制字符串形式的值,但跟踪器无法识别该值。另一方面,编码应答标记提供200 OK的返回 所以我需要转换我得到的十六进制表示: 9a81333c1b16e4a83c10f3052c1590aadf5e2e20 转换成编码形式 %9A%813%3C%1B%16%E4%A8%3C%1

我有一个SHA-1字节数组,我想在GET请求中使用它。我需要对这个进行编码
URLEncoder
需要一个字符串,如果我创建一个字符串,然后对其进行编码,它会损坏吗

澄清一下,这是我另一个问题的后续行动。 ()我可以获取十六进制字符串形式的值,但跟踪器无法识别该值。另一方面,编码应答标记提供200 OK的返回

所以我需要转换我得到的十六进制表示:

9a81333c1b16e4a83c10f3052c1590aadf5e2e20
转换成编码形式

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

这取决于您请求的接收者的期望。 我可以想象它可能是散列中字节的十六进制表示。字符串可能不是最好的主意,因为哈希数组很可能包含不可打印的字符值


我会迭代数组并使用Integer.toHexValue()将字节转换为十六进制。

SHA1是十六进制格式[0-9a-f],应该不需要对其进行URL编码。

在我回答时编辑了这个问题,下面是附加代码,应该可以使用(我的十六进制转换代码):

//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);
}
//效率低下,但功能正常,无法测试输入是否为十六进制字符集,因此有些不安全
//未测试,但应具有功能
公共静态字符串encodeURL(字符串hexString)引发异常{
if(hexString==null | | hexString.isEmpty()){
返回“”;
}
if(hexString.length()%2!=0){
抛出新异常(“字符串不是十六进制,长度不能被2整除:“+hexString”);
}
int len=hexString.length();
字符[]输出=新字符[len+len/2];
int i=0;
int j=0;

虽然(我用于您所有的编码/解码需要(ASN.1除外,这是一个麻烦的问题)

SHA1不是自动采用十六进制格式。所有SHA1结果都是一个字节数组。您可以将这些字节编码为十六进制。我已经编辑了我的帖子,以包含新代码来回答您编辑的问题。
/** 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);
         }