python string to hex

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Avatar utente
socket-raw
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 665
Iscrizione: giovedì 9 luglio 2009, 0:45
Desktop: KDE4
Distribuzione: kubuntu-14.04-LTS-x86_amd64
Località: Arpino

python string to hex

Messaggio da socket-raw »

Ciao a tutti,
ho la necessità di convertire una stringa in una sequenza di numeri esadecimali, questo è il codice che uso:

Codice: Seleziona tutto

def toHex(s):
    lst = []
    for ch in s:
        hv = hex(ord(ch)).replace('0x', '')
        if len(hv) == 1:
            hv = '0'+hv
        lst.append(hv)
    return reduce(lambda x,y:x+y, lst)


MESSAGE = "Hello, World!!"
 
dataH='\x48\x65\x6c\x6c\x6f\x2c\x20\x57\x6f\x72\x6c\x64\x21\x21'

print("MESSAGE:  %s"%MESSAGE)

print("dataH:  %s"%dataH)

print("dataH:  %s"%toHex(MESSAGE))
il risultato é

Codice: Seleziona tutto

MESSAGE:  Hello, World!!
dataH:  Hello, World!!

dataH:  48656c6c6f2c20576f726c642121
Data la stringa "Hello, World!!", usando la funzione che la converte in esadecimale, ottengo la giusta sequenza, ma per farla riconoscere come sequenza di numeri esadecimali dovrei aggiungere prima di ogni coppia di numeri, quali il 48 o il 65 o il 6c o ...., il simbolo '\x'.

Sapete darmi una mano?

Grazie
LIVE AND LET LIVE
melfnt
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1312
Iscrizione: sabato 15 ottobre 2011, 22:25

Re: python string to hex

Messaggio da melfnt »

Che significa "per farla riconoscere come sequenza di numeri esadecimali"? Da chi? Non basta aggiungere '\x' prima di ogni carattere, nella funzione?

;)
Avatar utente
crap0101
Rampante Reduce
Rampante Reduce
Messaggi: 8242
Iscrizione: martedì 30 ottobre 2007, 6:33
Desktop: LXDE
Distribuzione: Ubuntu 18.04.1 LTS
Sesso: Maschile
Località: TO
Contatti:

Re: python string to hex

Messaggio da crap0101 »

penso da print, un'alternativa per usare la stringa così come viene ottenuta dalla funzione è:

Codice: Seleziona tutto

>>> import codecs
>>> codecs.decode("48656c6c6f2c20576f726c642121", "hex")
'Hello, World!!'
>>> # oppure
>>> import binascii
>>> binascii.unhexlify('48656c6c6f2c20576f726c642121')
'Hello, World!!'
btw, nella tua funzione il modo in cui restituisci la stringa (oltre a ricordarmi un album dei pantera)
Spoiler
Mostra
vulgar display of power
è decisamente antiidiomatico e non particolarmente efficiente.... hai una lista di stringhe, usa join.

Anche la parte precedente non mi piace molto, a sto punto meglio scrivere una cosa del genere:

Codice: Seleziona tutto

>>> message = "Hello, World!!"
>>> ''.join(hex(ord(c))[2:].zfill(2) for c in message)
'48656c6c6f2c20576f726c642121'
che è uguale

Codice: Seleziona tutto

>>> codecs.decode(''.join(hex(ord(c))[2:].zfill(2) for c in message), 'hex')
'Hello, World!!'
inoltre, aggiungere `\x` è abbastanza inutile, siccome quella è solo *una* rappresentazione di quella stringa, una cosa che puoi scrivere tu nel codice del programma, ma che viene comunque salvata come una stringa "normale"... cioè 'Hello, World!!' e non '\x48\x65\x6c\x6c\x6f\x2c\x20\x57\x6f\x72\x6c\x64\x21\x21'. Potresti fare una roba del genere:

Codice: Seleziona tutto

>>> ''.join('\\x'+hex(ord(c))[2:].zfill(2) for c in message)
'\\x48\\x65\\x6c\\x6c\\x6f\\x2c\\x20\\x57\\x6f\\x72\\x6c\\x64\\x21\\x21'
>>> print ''.join('\\x'+hex(ord(c))[2:].zfill(2) for c in message)
\x48\x65\x6c\x6c\x6f\x2c\x20\x57\x6f\x72\x6c\x64\x21\x21
ma proprio solo se ti serve *stamparla* in quel modo, a livello di utilizzo interno nel programma è inutile, e anzi ti complica solo le cose.
http://www.gnu.org/ http://boinc.berkeley.edu/ http://www.python-it.org/
- Ricorda le ultime parole di suo padre: «Sta' alla larga dalle chiese, figlio. La sola cosa per cui hanno la chiave è il merdaio. E giurami che non porterai mai un distintivo della legge» - W.S. Burroughs
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 4 ospiti