Сравнение хеша из строки с хешем локального файла - PullRequest
0 голосов
/ 01 июня 2011

То, что я пытаюсь сделать, это прочитать из текстового файла, где каждая строка имеет путь к файлу, а затем место для разделителя и хеш, который его сопровождает. Поэтому я вызываю 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);
}

Ответы [ 2 ]

1 голос
/ 01 июня 2011

используйте следующий код для преобразования байтов хеша в строку

//byte[] md5sum = digest.digest();
BigInteger bigInt = new BigInteger(1, md5sum);
String output = bigInt.toString(16);
System.out.println("MD5: " + output);

для получения дополнительной информации

1 голос
/ 01 июня 2011

Метод String.getBytes() возвращает байты, которые представляют кодировки символов для строки. Он не разбирает его на байты, которые представляют число в некотором произвольном основании. Например, "AA".getBytes() даст вам 0x41 0x41 на окнах, а не 10101010b, чего вы ожидали ожидать? Чтобы получить то, что вы могли, например Byte.parseByte("AA", 16)

Библиотека, которую вы используете для создания хэшей, вероятно, имеет метод возврата в собственное строковое представление. Как конвертировать обратно зависит от представления, которое вы нам не дали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...