获取Java和C之间的匹配校验和#
我正在将一个方法从C#应用程序移植到Java,该方法为文件(base64编码)创建校验和。在C#中,这是一种方法:获取Java和C之间的匹配校验和#,java,c#,checksum,sha256,Java,C#,Checksum,Sha256,我正在将一个方法从C#应用程序移植到Java,该方法为文件(base64编码)创建校验和。在C#中,这是一种方法: public static string GetChecksum(byte[] bytes) { using (var stream = new MemoryStream(bytes)) { var sha = new SHA256Managed(); byte[] checksum = sha.ComputeHash(stream);
public static string GetChecksum(byte[] bytes)
{
using (var stream = new MemoryStream(bytes))
{
var sha = new SHA256Managed();
byte[] checksum = sha.ComputeHash(stream);
return BitConverter.ToString(checksum).Replace("-", String.Empty);
}
}
以下是我目前在Java中所做的,但它肯定与从C#返回的值不匹配:
我尝试过在getBytes()
方法中不使用字符集,我尝试过使用字符集US-ASCII
这东西不在我的驾驶室里,我不知道该怎么做。非常感谢您的帮助。您可以使用Guava库来计算哈希值
String sha256hex = Hashing.sha256()
.hashString(originalString, StandardCharsets.UTF_8)
.toString();
String sha256hex = DigestUtils.sha256Hex(originalString);
ApacheCommons编解码器还具有用于计算哈希的库
String sha256hex = Hashing.sha256()
.hashString(originalString, StandardCharsets.UTF_8)
.toString();
String sha256hex = DigestUtils.sha256Hex(originalString);
在Java中,要解码Base64字符串,您有以下内容(自Java8以来):
from:string.getBytes对您没有帮助。它将获得字符串中每个单个字符的字节值(使用所选的字符编码,在您的例子中是UTF-8)。它不会解码Base64字符串。我不了解Java,但浏览JDK文档,查找一些执行base64解码的类/方法…@elgonzo。好的,让我试试使用base64解码器。我几分钟后再报告。谢谢。@elgonzo。。。成功了。谢谢所以,你首先用解决问题所需的信息发表评论,然后其他人很快就发表了评论。有点尴尬我自己都没意识到,但是。。。你想让你的评论成为一个答案,我会接受的?既然已经有了关于Java中Base64解码的答案,我觉得我不需要再添加一个重复的答案;-)如果其中一个答案解决了您的问题,请随意接受。我不介意得不到任何声誉积分…;-)@elgonzo,酷。尽管如此,您作为第一个采取行动的人将永远被铭记在评论中:)对于他们的声誉点。
newstring(decodedBytes)
在解码字节是真正的二进制而不是文本数据时是不合适的(如果合适的话,最好明确指定一个字符集)。