Java 如何将SHA1输出转换为十六进制字符串?

Java 如何将SHA1输出转换为十六进制字符串?,java,string,sha1,Java,String,Sha1,我试图通过参考此链接中的示例来生成字符串的sha1- 公共类HashTextTest{ /** *@param args *@NoSuchAlgorithmException */ 公共静态void main(字符串[]args)抛出NoSuchAlgorithmException{ System.out.println(sha1(“测试字符串到sha1”); } 静态字符串sha1(字符串输入)抛出NoSuchAlgorithmException{ MessageDigest mDigest

我试图通过参考此链接中的示例来生成字符串的sha1-

公共类HashTextTest{
/**
*@param args
*@NoSuchAlgorithmException
*/
公共静态void main(字符串[]args)抛出NoSuchAlgorithmException{
System.out.println(sha1(“测试字符串到sha1”);
}
静态字符串sha1(字符串输入)抛出NoSuchAlgorithmException{
MessageDigest mDigest=MessageDigest.getInstance(“SHA1”);
byte[]result=mDigest.digest(input.getBytes());
StringBuffer sb=新的StringBuffer();
for(int i=0;i
我不想让字符串缓冲区中的这行乱七八糟的代码-
sb.append(Integer.toString((result[I]&0xff)+0x100,16).substring(1))


有没有其他方法可以做到这一点

这里需要的是将一个字节格式化为两个十六进制数字

sb.append(字符串格式(“%02x”,结果[i])就可以了

如果需要大写十六进制数字,请使用

sb.append(字符串格式(“%02X”,结果[i])


另外,如果不介意编码字节之间的空格,可以使用

new sun.misc.hextumpEncoder().encode(结果).substring(6)


一次对整个字节[]进行编码。

与SHA1无关。相反,您只需查看如何将
字节[]
转换为文本十六进制表示形式(或具有奇数
+0x100
的变体)。是的,请参阅以下答案:@user2864740-同意。它与sha1字符串无关。在代码中,我基本上是在寻找一种更优雅的方式将字节数组转换为十六进制字符串。我认为还有一种ApacheCommons方法。YMMV:还有斯诺特类似的帖子(有一些不同的实现),非常感谢大家。让我看看这些帖子。应该指出,使用任何sun.*类都是一个坏主意。这些类对于Java实现来说是私有的,并且可能会在Java的任何未来版本中发生更改甚至消失,即使是一个小的更新。
public class HashTextTest {

/**
 * @param args
 * @throws NoSuchAlgorithmException 
 */
public static void main(String[] args) throws NoSuchAlgorithmException {
    System.out.println(sha1("test string to sha1"));
}

static String sha1(String input) throws NoSuchAlgorithmException {
    MessageDigest mDigest = MessageDigest.getInstance("SHA1");
    byte[] result = mDigest.digest(input.getBytes());
    StringBuffer sb = new StringBuffer();
    for (int i = 0; i < result.length; i++) {
        sb.append(Integer.toString((result[i] & 0xff) + 0x100, 16).substring(1));
    }

    return sb.toString(); 

   }
}