2017-11-03 2 views
1

Ich arbeite mit Python 3 und versuche, eine Integer aus einem Digest in Python zu bekommen. Ich interessiere mich nur für die ersten n Bits des Digests.Wie werden die ersten n Bits eines Digests in eine ganze Zahl umgewandelt?

Was ich jetzt haben, ist dies:

n = 3 
int(hashlib.sha1(b'test').digest()[0:n]) 

Dies ist jedoch in einem ValueError: invalid literal for int() with base 10: b'\xa9J' Fehler führt.

Danke.

+0

Bits oder Bytes? Ein Stück des Digests wird in Bytes und nicht in Bits gemessen; Du hast dort 'n' Bytes gezogen. – ShadowRanger

+0

Ich hatte gehofft, die ersten n Bits zu bekommen. – Jones

Antwort

1

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).

Verwandte Themen