2016-11-22 2 views
3

große negative lange Binärkette zu packen, so versuche ich, es zu packen:Wie in Python

import struct 

num = 123L 
bin = struct.pack('q', num) 

die gut arbeitet, aber für große negative Werte:

num = -14710095416404972671L 
bin = struct.pack('q', num) 

ich diesen Fehler:

struct.error: long too large to convert to int 

von python 2.6

Welchen Weg kann ich es als Eingang für MD5-Hash konvertieren?

+1

Sie scheinen ein XY-Problem zu haben. Sind Sie mehr daran interessiert, eine gültige binäre Darstellung von 'num' zu erhalten oder den md5-Hash von' num' zu erhalten? – RegularlyScheduledProgramming

+0

@RegularlyScheduledProgramming Serverseite berechnet MD5-Hash der binären Darstellung von Long in C++, ich muss den gleichen Hash in Python implementieren. – Slava

+0

Ich überprüfte und sicher genug bekomme ich verschiedene Hashes mit 'struct.pack' vs' bin' im Hash, so dass ich meine Antwort gelöscht habe. Vielleicht sehen Sie sich die Quelle für das Modul 'struct' an. Viel Glück. – RegularlyScheduledProgramming

Antwort

1

Sie können nicht, diese Zahl passt einfach nicht in ein 8 Byte lang (signiert). Der maximale Wert, den Sie können Versorgung mit 'q' ist -2 ** 63, nicht weniger:

num = -2 ** 63 
bin = struct.pack('q', num) 

während:

num = -2 ** 63 - 1 
bin = struct.pack('q', num) 

zu error: argument out of range führt. Das ist die Obergrenze, mit 'Q' können Sie größere positive (unsigned) Werte erreichen, aber mit einer Grenze von 2 ** 64.

+0

Ich verstehe nicht ganz, warum dieser Wert, der 'EB95EC9D994ED78D' ist, nicht in 8 Bytes passt? Ist das Python-Beschränkung? – Slava

+0

@Slava Es passt, wenn Sie das Formatzeichen für unsigned long longs "Q" verwenden. Es wird nicht, wenn Sie "q" verwenden, die signierte 8-Byte-Nummern akzeptiert. –

+0

Das Problem, dass ich von C++ Server-Wert '-14710095416404972671L' bekomme, die dort als' EB95EC9D994ED78D' dargestellt, wie mache ich zuletzt von der ersten? – Slava

1

Sie haben eine Vielzahl von Auswahlmöglichkeiten, sobald Sie erkennen, dass MD5 mit jedem Byte-Stream arbeitet. Es ist wichtig zu beachten, dass das Zeichen für MD5 keine Rolle spielt. Es interpretiert keine ganzen Zahlen, es manipuliert einen Stream. Daher müssen Sie sich nicht um das Vorzeichen Ihrer Eingabe kümmern oder in vorzeichenbehaftete Ganzzahlen konvertieren. Sie benötigen ein Byte-Array, das Sie auf vielfältige Weise erhalten können, meine Präferenz ist:

In [30]: 0xEB95EC9D994ED78D.to_bytes(8, 'big') 
Out[30]: b'\xeb\x95\xec\x9d\x99N\xd7\x8d' 

die beliebige ganze Zahlen innerhalb der Grenzen des Python behandelt ganzen Zahlen ermöglichen.