我要做的是从文本文件中读取,其中每行都有文件的路径,然后是分隔符的空间和随附的散列。所以我调用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);
}
答案 0 :(得分:1)
String.getBytes()
方法返回表示字符串字符编码的字节。它不会将其解析为表示某个任意基数中的数字的字节。例如,"AA".getBytes()
会在Windows上产生0x41 0x41,而不是10101010b,这是你期望的那样?为此,您可以,例如Byte.parseByte("AA", 16)
您用于创建哈希的库可能有一种方法可以收回自己的字符串表示。如何转换回来取决于你没有给我们的表示。
答案 1 :(得分:1)
使用以下代码将哈希字节转换为字符串
//byte[] md5sum = digest.digest();
BigInteger bigInt = new BigInteger(1, md5sum);
String output = bigInt.toString(16);
System.out.println("MD5: " + output);