Konvertieren Sie Python Long / Int in Bytearray fester Größe
Ich versuche, die Implementierung von RC4-und DH-Schlüsselaustausch in python. Problem ist, dass ich keine Ahnung habe wie konvertiert man die python-long/int vom Austausch der Schlüssel, um das byte-array brauche ich für den RC4-Implementierung. Gibt es eine einfache Möglichkeit zu konvertieren lange, um die gewünschte Länge der byte-array?
Update: vergaß zu erwähnen, dass die zahlen, die ich bin den Umgang mit 768 bit unsigned Integer.
InformationsquelleAutor der Frage cdecker | 2012-01-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich habe nicht getan, alle benchmarks, aber dieses Rezept "funktioniert für mich".
Die kurze version: verwenden Sie
'%x' % val
dannunhexlify
das Ergebnis. Der Teufel liegt im Detail, obwohl, wieunhexlify
erfordert eine gerade Anzahl von hex-Ziffern, die%x
garantiert nicht. Finden Sie unter den docstring, und die liberale inline-Kommentare für details....und meine nosetest unit tests 😉
InformationsquelleAutor der Antwort Tripp Lilley
Mit Python 3.2 und höher verwenden, können Sie
int.to_bytes
undint.from_bytes
: https://docs.python.org/3/library/stdtypes.html#int.to_bytesInformationsquelleAutor der Antwort Jack O'Connor
One-liner:
192 768 /4, weil die OP wollte 768-bit-zahlen und gibt es 4 bits in hex-Ziffer. Wenn Sie eine größere
bytearray
verwenden Sie eine format-string-mit einer höheren Zahl. Beispiel:[Meine Antwort benutzt hatte
hex()
vor. Korrigiert habe ich es mitformat()
um int-Werte mit odd-size-byte-Ausdrücke. Dies behebt vorherigen Beschwerden überValueError
.]InformationsquelleAutor der Antwort Jess Austin
long/int zu byte-array aussieht genauen Zweck
struct.pack
. Für lange ganze zahlen, die mehr als 4(8) bytes, können Sie kommen mit so etwas wie das nächste:InformationsquelleAutor der Antwort Roman Bodnarchuk
Jeder hat kompliziert diese Antwort:
Brauchen Sie nur zu wissen, die Anzahl der bytes, die Sie versuchen zu konvertieren. In meinem use-cases, normalerweise verwende ich nur diese großen zahlen für crypto, und an diesem Punkt habe ich zu befürchten, Elastizitätsmodul und was nicht, also ich glaube nicht, dass das ein großes problem werden, erforderlich, zu wissen, die maximale Anzahl von bytes zurück.
Da Sie es tun 768-bit-Mathematik, dann statt 32 wie das argument, es wäre 96.
InformationsquelleAutor der Antwort sparticvs
Können Sie versuchen, mit struct:
InformationsquelleAutor der Antwort Eduardo Ivanec
Little-endian, reverse das Ergebnis oder den Bereich, wenn Sie wollen, Big-endian.
InformationsquelleAutor der Antwort scornwell
Im Grunde, was Sie tun müssen, ist, konvertieren Sie die int/long in seine base 256 Darstellung, D. H. eine Zahl, deren "Ziffern" - range von 0-255. Hier ist eine ziemlich effiziente Möglichkeit, etwas zu tun:
Ihnen viele nicht brauchen, die
reversed()
Anruf je nach endian-ness gewünscht (so würde dies erfordern, die Polsterung anders gemacht werden). Beachten Sie auch, dass, wie geschrieben es funktioniert nicht mit negativen zahlen.Vielleicht möchten Sie auch einen Blick auf die ähnlich, aber hoch optimierte
long_to_bytes()
Funktion in dernumber.py
Modul ist Teil der open-source -Python Cryptography Toolkit. Tatsächlich wandelt die Zahl in eine Zeichenfolge, die nicht ein byte-array, aber das ist ein kleines Problem.InformationsquelleAutor der Antwort martineau
Python 2.7 implementiert nicht die int.- sehr slow_bytes () - Methode.
Versuchte ich 3 Methoden:
Das war etwa doppelt so schnell wie 2/. Es ist die Schnellste option, aber immer noch zu langsam.
Alle diese Methoden sind sehr effektiv, aus zwei Gründen:
InformationsquelleAutor der Antwort GP Eckersley
InformationsquelleAutor der Antwort user1025874