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 нет числовых типов без знака.

Другие вопросы по тегам