为什么我的Java和命令行SHA256输出不同?

为什么我的Java和命令行SHA256输出不同?,java,sha256,Java,Sha256,在命令行上对字符串进行散列与在Android上对Java进行散列得到了不同的结果。我肯定我做错了什么,但我不知道是什么 命令行: kevin@aphrodite:~$ echo derp | sha256sum ee673d13de31533a375b41d9e57731d9bb4dbddbd6c1d2364f15be40fd783346 - 爪哇: Java输出: 10-05 13:32:57.412: D/Config(12082): input hash: 3f4146a1d0b5da

在命令行上对字符串进行散列与在Android上对Java进行散列得到了不同的结果。我肯定我做错了什么,但我不知道是什么

命令行:

kevin@aphrodite:~$ echo derp | sha256sum
ee673d13de31533a375b41d9e57731d9bb4dbddbd6c1d2364f15be40fd783346  -
爪哇:

Java输出:

10-05 13:32:57.412: D/Config(12082): input hash: 3f4146a1d0b5dac26562ff7dc6248573f4e996cf764a0f517318ff398dcfa792
下面是我在另一个问答中找到的
bytesToHex(…)
方法。我通过为每个
b
记录
Integer.toHexString(b)
来确认它做的事情是正确的

private static final char[] hexDigit = "0123456789abcdef".toCharArray();

private static String bytesToHex(byte[] bytes) {
    char[] hexChars = new char[bytes.length * 2];
    for (int i = 0; i < bytes.length; ++i) {
        int b = bytes[i] & 0xFF;
        hexChars[i * 2] = hexDigit[b >>> 4];
        hexChars[i * 2 + 1] = hexDigit[b & 0x0F];
    }
    return new String(hexChars);
}
private static final char[]hexDigit=“0123456789abcdef.tocharray();
私有静态字符串bytesToHex(字节[]字节){
char[]hexChars=新字符[bytes.length*2];
对于(int i=0;i>>4];
十六进制字符[i*2+1]=十六进制数字[b&0x0F];
}
返回新字符串(hexChars);
}

因为
echo
包含一个尾随的新行。你可以用

echo -n derp | sha256sum
\n
添加到
纯文本中

final String plaintext = "derp\n";

既然答案已经确定(
\n
在echo中),我还建议您可以用TestOhex()
代替您的自定义
,取而代之的是Android中不存在的@Keith。
final String plaintext = "derp\n";