Come posso eseguire una conversione di una stringa binaria nel corrispondente valore esadecimale in Python?Conversione Python da stringa binaria in esadecimale
Ho 0000 0100 1000 1101
e voglio ottenere 048D
Sto usando Python 2.6.
Come posso eseguire una conversione di una stringa binaria nel corrispondente valore esadecimale in Python?Conversione Python da stringa binaria in esadecimale
Ho 0000 0100 1000 1101
e voglio ottenere 048D
Sto usando Python 2.6.
Benvenuti in StackOverflow!
int
data base 2 e quindi hex
:
>>> int('010110', 2)
22
>>> hex(int('010110', 2))
'0x16'
>>>
>>> hex(int('0000010010001101', 2))
'0x48d'
Il dottore di int
:
int(x[, base]) -> integer Convert a string or number to an integer, if possible. A floating
punto argomento verrà troncato a zero (questo non include una rappresentazione di stringa di un numero in virgola mobile!) Quando si converte una stringa, utilizzare la base opzionale. È un errore fornire una base quando si converte una stringa non . Se la base è zero, la base corretta viene calcolata in base al contenuto di stringa . Se l'argomento non rientra nell'intervallo intero, verrà restituito invece un oggetto lungo .
Il dottore di hex
:
hex(number) -> string Return the hexadecimal representation of an integer or long
intero.
Supponendo che siano raggruppati per 4 e separati da spazi bianchi. Ciò preserva il principale 0.
b = '0000 0100 1000 1101'
h = ''.join(hex(int(a, 2))[2:] for a in b.split())
non hai bisogno di comprensione di lista lì – SilentGhost
buon punto. non so perché lo faccio sempre –
bstr = '0000 0100 1000 1101'.replace(' ', '')
hstr = '%0*X' % ((len(bstr) + 3) // 4, int(bstr, 2))
@SO dovrebbe davvero aggiungere colorazione per lingua. Qui pensa che // sia un commento in C++ e ignora tutto ciò che segue. // in Python non è un commento, ma troncando la divisione intera –
Risposta brillante. Sono sorpreso del fatto che non sia ancora pubblicizzato/accettato. – Andrei
Puoi spiegare come/perché funziona? – Dennis
>>> import string
>>> s="0000 0100 1000 1101"
>>> ''.join([ "%x"%string.atoi(bin,2) for bin in s.split() ] )
'048d'
>>>
o
>>> s="0000 0100 1000 1101"
>>> hex(string.atoi(s.replace(" ",""),2))
'0x48d'
L'utilizzo del modulo stringa è così anni 1990 ... –
quindi qual è il problema? È ancora in Python 2.6 – ghostdog74
È ancora in 2.X per il beneficio delle persone che lo stavano usando in 1.X. string.atoi() è conforme alla documentazione 2.6 "" "Deprecato dalla versione 2.0: utilizza la funzione integrata int()." "" e non è presente in 3.X. L'implementazione 2.X di string.atoi() chiama int(). Non c'è una buona ragione per dire ad alcuni nuovi arrivati che string.atoi() esiste anche per non dire loro di usarlo invece di dire loro di usare int(). –
Conversione binario in esadecimale senza ignorare gli zeri iniziali:
Si potrebbe utilizzare il formato() built-in funzione come questa:
"{0:0>4X}".format(int("0000010010001101", 2))
format(int(bits, 2), '0' + str(len(bits)/4) + 'x')
È necessario sostituire gli spazi prima della conversione. – Andrei
Utilizzando non concatenazioni disordinato e padding:
'{:0{width}x}'.format(int(temp,2)), width=4)
darà una rappresentazione esadecimale con imbottitura conservato
Per una qualche ragione ho avuto problemi con alcune di queste risposte, ho andato e ho scritto un paio di funzioni di supporto per me stesso, quindi se hai problemi come quello che ho fatto, prova questi.
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))
Sembrano funzionare bene.
print hex_string_to_hex_value("FF")
print hex_string_to_hex_value("")
print bin_string_to_bin_value("11010001101011")
risultati in: modulo binascii
0xff
0x1234567
0b11010001101011
Dove si trova bin_value_to_hex_string? –
Usa di pitone
import binascii
binFile = open('somebinaryfile.exe','rb')
binaryData = binFile.read(8)
print binascii.hexlify(binaryData)
Questo non riesce a conservare 0 non significativi. –
@ Ignacio, hai ragione, ma non penso che l'OP abbia chiesto questo. In ogni caso, ++ alla tua risposta per averlo indicato. –
@Eli: l'OP ha detto espressamente che voleva '048d', cioè vuole portare zero, NON desidera 0x –