Integer.toHexString в Python - PullRequest
       3

Integer.toHexString в Python

0 голосов
/ 03 августа 2020

Здесь у меня java код

static String md5(byte[] bArr) {
    MessageDigest instance = MessageDigest.getInstance("MD5");
    instance.update(bArr);
    byte[] digest = instance.digest();
    StringBuffer sb = new StringBuffer();
    for (byte b : digest) {
        sb.append(Integer.toHexString(b & 0xffffffff));
    }
    return sb.toString();
}

звонок md5("A".getBytes()), я получил

7fffffffc56270ffffffe7ffffffa7fffffffa81a5935ffffffb72effffffacffffffbe29

Как я могу добиться того же результата с помощью Python? Я попытался использовать следующее

m = hashlib.md5()
m.update(str.encode('utf-8'))
bytes = m.digest()
return ''.join('{:02x}'.format(x) for x in bytes)

. Я получил

7fc56270e7a70fa81a5935b72eacbe29

, который совпадает с m.hexdigest()

Изменить: проблема выглядит с этими «отрицательными» байты между ними. например, второй байт равен «-59» в int в Java, но Python каким-то образом не распознает, а 5-й байт равен «-25»

Эти 'f' являются отрицательными.

1 Ответ

0 голосов
/ 03 августа 2020

Версия java ... странная. Он берет каждый байт, расширяет его до целого числа, затем берет дополнение целого числа до единицы и форматирует его. Это как сломанная версия беззнаковых байтов со знаком.

Что совершенно не нужно в первую очередь в Python, поскольку байты всегда беззнаковые. Но если вы действительно этого хотите, вы можете просто отформатировать x | 0xffffff00 в шестнадцатеричный (он будет "дополнять" байт 6 ff s).

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