如何解决比较字符串中的哈希值与本地文件的哈希值
| 我想做的是从一个文本文件中读取的,其中每一行都有文件的路径,然后是分隔符和伴随它的哈希的空间。因此,我调用checkVersion()和loadStrings(File f_)返回String [],每一行一个位置。但是,当我尝试检查哈希值时,我得到的结果甚至不是十六进制的,并且是其应有长度的两倍,这很明显是我的眼睛被忽略了。背后的想法是为我的游戏自动更新以节省带宽,谢谢您的时间。 代码是固定的,如果有人遇到此问题,这里是最终版本,非常感谢大家。void checkVersion() {
String[] v = loadStrings(\"version.txt\");
for(int i=0; i<v.length; i++) {
String[] piece = split(v[i],\" \"); //BREAKS INTO FILENAME,HASH
println(\"Checking \"+piece[0]+\"...\"+piece[1]);
if(checkHash(piece[0],piece[1])) {
println(\"ok!\");
} else {
println(\"NOT OKAY!\");
//CONTINUE TO DOWNLOAD FILE AND THEN CALL CHECKVERSION AGAIN
}
}
}
boolean checkHash(String path_,String hash_) {
return createHash(path_).equals(hash_);
}
byte[] messageDigest(String message,String algorithm) {
try {
java.security.MessageDigest md = java.security.MessageDigest.getInstance(algorithm);
md.update(message.getBytes());
return md.digest();
} catch(java.security.NoSuchAlgorithmException e) {
println(e.getMessage());
return null;
}
}
String createHash(String path_) {
byte[] md5hash = messageDigest(new String(loadBytes(path_)),\"MD5\");
BigInteger bigInt = new BigInteger(1,md5hash);
return bigInt.toString(16);
}
解决方法
String.getBytes()
方法返回表示字符串字符编码的字节。它不会将其解析为以任意基数表示数字的字节。例如,在Windows上,ѭ2yield会产生0x41 0x41,而不是10101010b,这是您期望的样子吗?要做到这一点,例如Byte.parseByte(\"AA\",16)
您用来创建散列的库可能具有一种用于收回其自己的字符串表示形式的方法。如何转换回去取决于您没有提供给我们的表示形式。
, 使用以下代码将哈希字节转换为字符串
//byte[] md5sum = digest.digest();
BigInteger bigInt = new BigInteger(1,md5sum);
String output = bigInt.toString(16);
System.out.println(\"MD5: \" + output);
了解更多信息
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。