Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 比较字符串的哈希值与本地文件的哈希值_Java_Md5 - Fatal编程技术网

Java 比较字符串的哈希值与本地文件的哈希值

Java 比较字符串的哈希值与本地文件的哈希值,java,md5,Java,Md5,我要做的是从一个文本文件中读取,其中每一行都有一个文件的路径,然后在空间中放置一个分隔符和一个伴随它的散列。因此,我调用checkVersion()和loadStrings(文件f_3;)返回一个字符串[],每行一个位置。当我尝试检查哈希值时,我得到的结果甚至不是十六进制,是它应该的两倍长,这可能是我的眼睛所忽略的明显的东西。这背后的想法是我的游戏自动更新,以节省带宽,谢谢你的时间 代码是固定的,这里是最终版本,如果其他人有这个问题,非常感谢大家 void checkVersion() {

我要做的是从一个文本文件中读取,其中每一行都有一个文件的路径,然后在空间中放置一个分隔符和一个伴随它的散列。因此,我调用checkVersion()和loadStrings(文件f_3;)返回一个字符串[],每行一个位置。当我尝试检查哈希值时,我得到的结果甚至不是十六进制,是它应该的两倍长,这可能是我的眼睛所忽略的明显的东西。这背后的想法是我的游戏自动更新,以节省带宽,谢谢你的时间

代码是固定的,这里是最终版本,如果其他人有这个问题,非常感谢大家

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);
}
void checkVersion(){
String[]v=loadStrings(“version.txt”);
对于(int i=0;i,
String.getBytes()
方法返回表示字符串字符编码的字节。它不会将其解析为以任意基数表示数字的字节。例如
“AA”.getBytes()
将在windows上生成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);

如何加载字节?是否可能以文本模式打开二进制文件?getBytes(字符串文件名)方法以AIK方式加载二进制数据。它返回一个字节数组,描述为“打开文件并读取其二进制数据”,它来自“处理”库。
void createHash(字符串路径){println(路径_+“”);byte[]md5hash=messageDigest(新字符串(loadBytes(path))),“MD5”);for(int i=0;这是我用来创建哈希的。我只是从终端复制并粘贴了结果。我没有完全理解你的意思,但基本上编码是关闭的,或者没有指定?`void createHash(String path){println(path)+“”);byte[]md5hash=messageDigest(新字符串(loadBytes(path))),“MD5”);for(int i=0;这是一堆,这正是我所需要的-我在某处看到了类似的内容,但我没有想到这可能是一种更好的方式,谢谢。