Die PY3 Lösung zu verwenden int.from_bytes
ist bytes
zu int
konvertieren, dann den Teil verschieben off Sie nicht interessieren:
def bitsof(bt, nbits):
# Directly convert enough bytes to an int to ensure you have at least as many bits
# as needed, but no more
neededbytes = (nbits+7)//8
if neededbytes > len(bt):
raise ValueError("Require {} bytes, received {}".format(neededbytes, len(bt)))
i = int.from_bytes(bt[:neededbytes], 'big')
# If there were a non-byte aligned number of bits requested,
# shift off the excess from the right (which came from the last byte processed)
if nbits % 8:
i >>= 8 - nbits % 8
return i
Beispiel für die Verwendung: 2
>>> bitsof(hashlib.sha1(b'test').digest(), 3)
5 # The leftmost bits of the a nibble that begins the hash
auf Python, Die Funktion kann fast so wie sie ist verwendet werden, abgesehen von dem Hinzufügen eines binascii
Imports, und das Ändern der Umwandlung von bytes
zu int
zu der etwas weniger effizienten zweistufigen Umwandlung (f rom str
zu Hex-Darstellung, dann int
mit base
von 16 unter Verwendung es zu analysieren):
i = int(binascii.hexlify(bt[:neededbytes]), 16)
Alles andere funktioniert wie (auch der //
Operator funktioniert wie erwartet; Python 2's /
Operator unterscheidet sich von Py 3, aber //
funktioniert das gleiche auf beiden).
Bits oder Bytes? Ein Stück des Digests wird in Bytes und nicht in Bits gemessen; Du hast dort 'n' Bytes gezogen. – ShadowRanger
Ich hatte gehofft, die ersten n Bits zu bekommen. – Jones