Ich habe ABC123EFFF.
Ich möchte 001010101111000001001000111110111111111111 haben (dh binäre Repräsentation mit beispielsweise 42 Ziffern und führenden Nullen).
Wie?
Zur Lösung des Problems der nachgestellten Null auf der linken Seite:
my_hexdata = "1a"
scale = 16 ## equals to hexadecimal
num_of_bits = 8
bin(int(my_hexdata, scale))[2:].zfill(num_of_bits)
Es wird 00011010 anstelle der getrimmten Version geben.
len(my_hexdata) * log2(scale)
.Lesen
binascii.unhexlify
Gibt die Binärdaten zurück, die durch die als Parameter angegebene hexadezimale Zeichenfolge dargestellt werden.
quelle
quelle
Kurze Antwort:
Mit den neuen F-Strings in Python 3.6 können Sie dies mit einer sehr knappen Syntax tun:
oder um das mit der Semantik zu brechen:
Lange Antwort:
Was Sie tatsächlich sagen, ist, dass Sie einen Wert in einer hexadezimalen Darstellung haben und einen äquivalenten Wert in einer Binärdarstellung darstellen möchten.
Der Wert der Äquivalenz ist eine ganze Zahl. Sie können jedoch mit einer Zeichenfolge beginnen. Um eine Binärdatei anzuzeigen, müssen Sie mit einer Zeichenfolge enden.
Hex in Binär, 42 Ziffern und führende Nullen umwandeln?
Wir haben mehrere direkte Möglichkeiten, um dieses Ziel zu erreichen, ohne Hacks mit Slices.
Bevor wir überhaupt eine binäre Manipulation durchführen können, konvertieren Sie zunächst in int (ich nehme an, dass dies in einem Zeichenfolgenformat und nicht als Literal erfolgt):
alternativ könnten wir ein ganzzahliges Literal verwenden, das in hexadezimaler Form ausgedrückt wird:
Jetzt müssen wir unsere ganze Zahl in einer binären Darstellung ausdrücken.
Verwenden Sie die eingebaute Funktion,
format
Dann weitergeben an
format
:Diese verwendet die Formatierung der Spezifikation Mini-Sprache .
Um das aufzuschlüsseln, hier ist die Grammatikform:
Um dies zu einer Spezifikation für unsere Bedürfnisse zu machen, schließen wir nur die Dinge aus, die wir nicht brauchen:
und übergeben Sie das einfach an das Format
String-Formatierung (Template) mit
str.format
Wir können das in einem String mit der
str.format
Methode verwenden:Oder fügen Sie die Spezifikation einfach direkt in die ursprüngliche Zeichenfolge ein:
String-Formatierung mit den neuen F-Strings
Lassen Sie uns die neuen F-Strings demonstrieren. Sie verwenden dieselben Formatierungsregeln für Mini-Sprachen:
Fügen wir diese Funktionalität nun in eine Funktion ein, um die Wiederverwendbarkeit zu fördern:
Und nun:
Beiseite
Wenn Sie die Daten eigentlich nur als Byte-Zeichenfolge im Speicher oder auf der Festplatte codieren möchten, können Sie die
int.to_bytes
Methode verwenden, die nur in Python 3 verfügbar ist:Und da 42 Bits geteilt durch 8 Bits pro Byte 6 Bytes entsprechen:
quelle
'0b10101011110000010010001111101111111111'
quelle
quelle
Hier ist eine ziemlich rohe Methode, um die binären Zeichenfolgen mithilfe von Bit-Fiddling zu generieren.
Der Schlüssel zum Verständnis ist:
Dies erzeugt entweder eine 0 oder eine 1, wenn das i-te Bit von n gesetzt ist.
Bearbeiten: mit dem "neuen" ternären Operator dies:
Würde werden:
(Welche TBH bin ich mir nicht sicher, wie lesbar das ist)
quelle
01111001
11111110
.Dies ist eine kleine Verbesserung der Lösung von Glen Maynard, die meiner Meinung nach der richtige Weg ist, dies zu tun. Es wird nur das Auffüllelement hinzugefügt.
Zog es aus einer Klasse. Nehmen
self,
Sie es einfach heraus, wenn Sie in einem eigenständigen Skript arbeiten.quelle
Verwenden Sie die integrierte Funktion format () und die Funktion int (). Sie ist einfach und leicht zu verstehen. Es ist eine etwas vereinfachte Version der Antwort von Aaron
int ()
Format()
Beispiel
Siehe auch diese Antwort
quelle
Ersetzen Sie jede hexadezimale Ziffer durch die entsprechenden 4 Binärziffern:
quelle
hex -> dezimal dann dezimal -> binär
quelle
Ein anderer Weg:
quelle
Ich habe die Berechnung für die Anzahl der zu füllenden Bits zu Onedinkenedis Lösung hinzugefügt. Hier ist die resultierende Funktion:
Dabei ist 16 die Basis, von der Sie konvertieren (hexadezimal), und 4 die Anzahl der Bits, die Sie zur Darstellung jeder Ziffer oder der Protokollbasis 2 der Skala benötigen.
quelle
quelle
Ich habe eine kurze Hoffnung, die hilft :-)
Zuerst benutze ich deine Eingabe und zähle sie auf, um jedes Symbol zu erhalten. dann konvertiere ich es in binär und schneide von der 3. Position bis zum Ende. Der Trick, um die 0 zu erhalten, besteht darin, den Maximalwert der Eingabe zu addieren -> in diesem Fall immer 16 :-)
Die Kurzform ist die Join-Methode. Genießen.
quelle
quelle
Die Binärversion von ABC123EFFF ist tatsächlich 1010101111000001001000111110111111111111
Für fast alle Anwendungen soll die Binärversion eine Länge haben, die ein Vielfaches von 4 mit einem führenden Abstand von 0 ist.
So erhalten Sie dies in Python:
Beispiel 1:
Beispiel 2:
Beachten Sie, dass dies auch in Micropython funktioniert :)
quelle
Verwenden Sie einfach den Modul- Coden (Hinweis: Ich bin der Autor des Moduls)
Dort können Sie haxedecimal in binär konvertieren.
Die konvertierenden Schlüsselwörter sind:
Sie können also auch Folgendes formatieren: e. hexadecimal_output = bin_to_hex (a_binary_number)
quelle
HEX_TO_BINARY_CONVERSION_TABLE = {'0': '0000',
quelle
quelle
quelle
quelle