Come posso convertire una stringa di byte in un int in Python?
Dì così: 'y\xcc\xa6\xbb'
Ho trovato un modo intelligente / stupido di farlo:
sum(ord(c) << (i * 8) for i, c in enumerate('y\xcc\xa6\xbb'[::-1]))
So che ci deve essere qualcosa incorporato o nella libreria standard che lo fa più semplicemente ...
Ciò è diverso dalla conversione di una stringa di cifre esadecimali per cui è possibile utilizzare int (xxx, 16), ma invece voglio convertire una stringa di valori di byte effettivi.
AGGIORNARE:
Mi piace la risposta di James un po 'meglio perché non richiede l'importazione di un altro modulo, ma il metodo di Greg è più veloce:
>>> from timeit import Timer
>>> Timer('struct.unpack("<L", "y\xcc\xa6\xbb")[0]', 'import struct').timeit()
0.36242198944091797
>>> Timer("int('y\xcc\xa6\xbb'.encode('hex'), 16)").timeit()
1.1432669162750244
Il mio metodo hacky:
>>> Timer("sum(ord(c) << (i * 8) for i, c in enumerate('y\xcc\xa6\xbb'[::-1]))").timeit()
2.8819329738616943
ULTERIORI AGGIORNAMENTI:
Qualcuno ha chiesto nei commenti qual è il problema con l'importazione di un altro modulo. Bene, l'importazione di un modulo non è necessariamente economica, dai un'occhiata:
>>> Timer("""import struct\nstruct.unpack(">L", "y\xcc\xa6\xbb")[0]""").timeit()
0.98822188377380371
Includere il costo dell'importazione del modulo annulla quasi tutti i vantaggi di questo metodo. Ritengo che ciò includerà le spese di importazione una sola volta per l'intero ciclo di riferimento; guarda cosa succede quando lo costringo a ricaricare ogni volta:
>>> Timer("""reload(struct)\nstruct.unpack(">L", "y\xcc\xa6\xbb")[0]""", 'import struct').timeit()
68.474128007888794
Inutile dire che se si eseguono molte esecuzioni di questo metodo per una importazione, questo diventa proporzionalmente meno un problema. Probabilmente è anche un costo di I / O piuttosto che CPU, quindi potrebbe dipendere dalla capacità e dalle caratteristiche di carico della macchina particolare.
int.from_bytes
) eseguita struct.unpack
sul mio computer. Accanto ad essere più leggibile imo.