Распаковка результата palemd160 в python
Я работаю над программой, которая выполняет много хэширования, и на одном из шагов я беру результат хеша hasmlib maturemd160 и преобразую его в целое число. Линии:
ripe_fruit = new('ripemd160', sha256(key.to_der()).digest())
key_hash160 = struct.unpack("<Q", ripe_fruit.digest())[0]
Это дает мне ошибку:
struct.error: unpack requires a buffer of 8 bytes
Я пытался изменить значение на L и другие вещи, но они не работали. Как это исправить?
1 ответ
RIPEMD-160 возвращает 160 бит или 20 байтов. struct
не знает, как распаковать целые числа больше 8 байт. У вас есть два варианта, и правильный выбор зависит от того, что именно вы пытаетесь сделать.
Если ваш алгоритм ищет только некоторые байты хэша, вы можете взять первые или последние 8 байтов и распаковать их.
key_hash160 = struct.unpack("<Q", ripe_fruit.digest()[:8])[0]
Если вам нужно целое число в 160 байтов, сначала вы должны решить, как оно представлено. Является ли это прямым или старшим или что-то среднее? Затем вы можете разбить массив на 20 байтов, а затем вычислить одно число из них. Предполагая, что в порядке
<
в своем вопросе вы можете сделать что-то вроде:key_parts = struct.unpack("B" * 20, ripe_fruit.digest()) key_hash160 = 0 for b in key_parts[::-1]: key_hash160 <<= 8 key_hash160 |= b