¿Cómo puedo convertir una cadena de bytes en un int en python?convertir una cadena de bytes en un int (python)
decir como esto: 'y\xcc\xa6\xbb'
me ocurrió una forma inteligente/estúpido de hacerlo:
sum(ord(c) << (i * 8) for i, c in enumerate('y\xcc\xa6\xbb'[::-1]))
Sé que tiene que haber algo por el computador o en la biblioteca estándar que hace esto más simplemente ...
Esto es diferente de converting a string of hex digits para el que puede usar int (xxx, 16), pero en su lugar quiero convertir una cadena de valores de bytes reales.
ACTUALIZACIÓN:
me gusta la respuesta de James un poco mejor, ya que no requiere la importación de otro módulo, pero el método de Greg es más rápido:
>>> 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
Mi método hacky:
>>> Timer("sum(ord(c) << (i * 8) for i, c in enumerate('y\xcc\xa6\xbb'[::-1]))").timeit()
2.8819329738616943
ADEMÁS dE ACTUALIZACIÓN:
Alguien preguntó en los comentarios cuál es la pr Oblem con la importación de otro módulo. Así, la importación de un módulo no es necesariamente barato, echar un vistazo:
>>> Timer("""import struct\nstruct.unpack(">L", "y\xcc\xa6\xbb")[0]""").timeit()
0.98822188377380371
Incluyendo el costo de importar el módulo niega casi toda la ventaja de que este método tiene. Creo que esto solo incluirá el gasto de importarlo una vez para la ejecución de referencia completa; mira lo que pasa cuando me fuerzo para recargar cada vez que:
>>> Timer("""reload(struct)\nstruct.unpack(">L", "y\xcc\xa6\xbb")[0]""", 'import struct').timeit()
68.474128007888794
Huelga decir que, si está haciendo una gran cantidad de ejecuciones de este método por cada importación que esto se convierte proporcionalmente menos de un problema. También es probable que tenga un costo de I/O en lugar de una CPU, por lo que puede depender de la capacidad y las características de carga de la máquina en particular.
e importar algo de la lib estándar es malo, ¿por qué? – hop
andyway, duplicado: http://stackoverflow.com/questions/5415/convert-bytes-to-floating-point-numbers-in-python – hop
su "actualización adicional" es extraña ... ¿por qué importaría el módulo tan ¿a menudo? – hop