Java MD5 шифрование минус значение в байтовом массиве
Здравствуйте, я использую приведенный ниже код для шифрования строки. Я нашел, что MD5 заставляет работать в -127 - +128 значениях.
Я получаю значение в минус за.
public static void main(String[] args) throws Exception {
String message = "smile";
encrypt("Jack the Bear");
}
public static void encrypt(String password) throws Exception {
byte byteData[] =null;
MessageDigest md = null;
try {
md = MessageDigest.getInstance("MD5");
md.update(password.getBytes("US-ASCII"));
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
byteData = md.digest();
System.out.println(Arrays.toString(byteData));
}
Мой вывод: [101, 23, 66, 106, 91, -51, 6, 119, -13, 23, -101, 108, -122, 27, 20, -124]
Реальный результат: [101, 23, 66, 106, 91, 205, 6, 119, 243, 23, 155, 108, 134, 27, 20, 132]
2 ответа
Это потому что byte
тип в Java (как и почти все другие типы) подписан, что означает, что он имеет диапазон -128..127
,
Если вы хотите преобразовать этот диапазон в неподписанный диапазон (0..255
), сделай это:
byte b = -2;
int i = b & 0xff;
Распечатать свой результат byteData
как это:
for (byte b : byteData)
System.out.print((b & 0xff) + " ");
Если вы хотите напечатать результат в шестнадцатеричном формате:
for (byte b : byteData)
System.out.printf("%02x ", b);
Ваш дайджест вычислен правильно, нет ничего плохого в отрицательных значениях байтов.
Тип байтов в Java варьируется от -128 до +127, что может быть несколько удивительно - многие считают, что байт не имеет знака, но в Java нет числовых типов без знака.