2010-01-15 8 views

Antwort

46

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.

+4

die Nutzung Python Dies scheitert führenden 0s zu bewahren. –

+0

@Ignacio, du hast recht, aber ich glaube nicht, dass das OP danach gefragt hat. In jedem Fall, ++ zu deiner Antwort, um das zu zeigen. –

+3

@Eli: der OP sagte ausdrücklich, er wollte '048d', d. H. Will führende Null, NICHT wollen 0x –

0

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()) 
+0

Sie brauchen kein Listenverständnis dort – SilentGhost

+0

guten Punkt. weiß nicht, warum ich das immer mache. –

20
bstr = '0000 0100 1000 1101'.replace(' ', '') 
hstr = '%0*X' % ((len(bstr) + 3) // 4, int(bstr, 2)) 
+4

@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 –

+0

Brillante Antwort. Ich bin überrascht, warum es noch nicht abgestimmt/akzeptiert wurde. – Andrei

+2

Können Sie erklären, wie/warum das funktioniert? – Dennis

-3
>>> 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' 
+2

Die Verwendung des String-Moduls ist so 1990er ... –

+0

Also, was ist das Problem? Es ist immer noch in Python 2.6 – ghostdog74

+1

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

6

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)) 
+0

Dies funktioniert nur für 2-Byte-Zahlen, während Ignacios Antwort für jede Länge funktioniert. – Andrei

+0

Sie müssen nach wie vor Leerzeichen ersetzen. – Andrei

0
format(int(bits, 2), '0' + str(len(bits)/4) + 'x') 
+0

Sie müssen Leerzeichen vor der Konvertierung ersetzen. – Andrei

3

keine unordentlichen Verkettungen und padding verwenden:

'{:0{width}x}'.format(int(temp,2)), width=4) 

Wird eine hexadezimale Darstellung geben mit Polsterung

0

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 
+3

Wo ist bin_value_to_hex_string? –

7

binascii Modul

import binascii 

binFile = open('somebinaryfile.exe','rb') 
binaryData = binFile.read(8) 

print binascii.hexlify(binaryData) 
Verwandte Themen