Wie kann ich eine Umwandlung einer Binärzeichenfolge in den entsprechenden Hex-Wert in Python durchführen?Python-Konvertierung von Binärzeichenfolge in Hexadezimal
Ich habe 0000 0100 1000 1101
und ich möchte 048D
Ich benutze Python 2.6.
Wie kann ich eine Umwandlung einer Binärzeichenfolge in den entsprechenden Hex-Wert in Python durchführen?Python-Konvertierung von Binärzeichenfolge in Hexadezimal
Ich habe 0000 0100 1000 1101
und ich möchte 048D
Ich benutze Python 2.6.
Willkommen bei StackOverflow!
int
gegebene Basis 2 und dann hex
:
>>> int('010110', 2)
22
>>> hex(int('010110', 2))
'0x16'
>>>
>>> hex(int('0000010010001101', 2))
'0x48d'
Die doc von int
:
int(x[, base]) -> integer Convert a string or number to an integer, if possible. A floating
Punkt Argument wird in Richtung Null abgeschnitten werden (dies schließt nicht eine Zeichenfolge Repräsentation einer Fließkommazahl!) Beim Konvertieren eines Strings verwendendie optionale Basis. Es ist ein Fehler, eine Basis zu liefern, wenn ein Non-String konvertiert wird. Wenn die Basis Null ist, wird basierend auf dem Zeichenfolgeninhalt die richtige Basis geschätzt. Wenn das Argument außerhalb des Ganzzahlbereichs liegt, wird stattdessen ein langes Objekt zurückgegeben.
Die doc von hex
:
hex(number) -> string Return the hexadecimal representation of an integer or long
ganze Zahl ist.
Angenommen, sie sind nach 4 gruppiert und durch Whitespace getrennt. Auf diese Weise bleibt die führende 0.
b = '0000 0100 1000 1101'
h = ''.join(hex(int(a, 2))[2:] for a in b.split())
Sie brauchen kein Listenverständnis dort – SilentGhost
guten Punkt. weiß nicht, warum ich das immer mache. –
bstr = '0000 0100 1000 1101'.replace(' ', '')
hstr = '%0*X' % ((len(bstr) + 3) // 4, int(bstr, 2))
@SO sollte wirklich per-Sprache Färbung hinzufügen. Hier denkt es sich // ist ein C++ Kommentar und gräbt alles Folgende aus. // in Python ist kein Kommentar, aber abgeschnittene Ganzzahl Division –
Brillante Antwort. Ich bin überrascht, warum es noch nicht abgestimmt/akzeptiert wurde. – Andrei
Können Sie erklären, wie/warum das funktioniert? – Dennis
>>> import string
>>> s="0000 0100 1000 1101"
>>> ''.join([ "%x"%string.atoi(bin,2) for bin in s.split() ] )
'048d'
>>>
oder
>>> s="0000 0100 1000 1101"
>>> hex(string.atoi(s.replace(" ",""),2))
'0x48d'
Die Verwendung des String-Moduls ist so 1990er ... –
Also, was ist das Problem? Es ist immer noch in Python 2.6 – ghostdog74
Es ist immer noch in 2.X für die Menschen, die es in 1.X. string.atoi() ist laut 2.6 docs "" "Veraltet seit Version 2.0: Verwenden Sie die integrierte Funktion int()" "und ist in 3.X nicht vorhanden. Die 2.X-Implementierung von string.atoi() ruft int() auf. Es gibt keinen guten Grund, einem Neuankömmling zu sagen, dass string.atoi() sogar existiert, geschweige denn, dass er ihnen sagt, sie zu benutzen, anstatt ihnen zu sagen, dass sie int() benutzen sollen. –
Konvertieren von Binär in hex ohne führende Nullen zu ignorieren:
Sie könnten das Format() verwenden, built-in Funktion wie folgt:
"{0:0>4X}".format(int("0000010010001101", 2))
format(int(bits, 2), '0' + str(len(bits)/4) + 'x')
Sie müssen Leerzeichen vor der Konvertierung ersetzen. – Andrei
keine unordentlichen Verkettungen und padding verwenden:
'{:0{width}x}'.format(int(temp,2)), width=4)
Wird eine hexadezimale Darstellung geben mit Polsterung
Für Grund, warum ich mit einigen dieser Antworten hatten Probleme, was auch immer erhalten haben, habe ich ging und schrieb ein paar Helferfunktionen für mich selbst, also wenn Sie Probleme wie ich haben, geben Sie diese einen Versuch.
def bin_string_to_bin_value(input):
highest_order = len(input) - 1
result = 0
for bit in input:
result = result + int(bit) * pow(2,highest_order)
highest_order = highest_order - 1
return bin(result)
def hex_string_to_bin_string(input):
lookup = {"0" : "0000", "1" : "0001", "2" : "0010", "3" : "0011", "4" : "0100", "5" : "0101", "6" : "0110", "7" : "0111", "8" : "1000", "9" : "1001", "A" : "1010", "B" : "1011", "C" : "1100", "D" : "1101", "E" : "1110", "F" : "1111"}
result = ""
for byte in input:
result = result + lookup[byte]
return result
def hex_string_to_hex_value(input):
bin_string = hex_string_to_bin_string(input)
bin_value = bin_string_to_bin_value(bin_string)
return hex(int(bin_value, 2))
Sie scheinen gut zu funktionieren.
print hex_string_to_hex_value("FF")
print hex_string_to_hex_value("")
print bin_string_to_bin_value("11010001101011")
Ergebnisse in:
0xff
0x1234567
0b11010001101011
Wo ist bin_value_to_hex_string? –
binascii Modul
import binascii
binFile = open('somebinaryfile.exe','rb')
binaryData = binFile.read(8)
print binascii.hexlify(binaryData)
die Nutzung Python Dies scheitert führenden 0s zu bewahren. –
@Ignacio, du hast recht, aber ich glaube nicht, dass das OP danach gefragt hat. In jedem Fall, ++ zu deiner Antwort, um das zu zeigen. –
@Eli: der OP sagte ausdrücklich, er wollte '048d', d. H. Will führende Null, NICHT wollen 0x –