Как преобразовать строку байтов в int в python?преобразовать строку байтов в int (python)
Скажем так: 'y\xcc\xa6\xbb'
я придумал умный/глупый способ сделать это:
sum(ord(c) << (i * 8) for i, c in enumerate('y\xcc\xa6\xbb'[::-1]))
Я знаю, что там должно быть что-то встроенных или в стандартной библиотеке, что делает это более просто ...
Это отличается от converting a string of hex digits, для которого вы можете использовать int (xxx, 16), но вместо этого я хочу преобразовать строку фактических байтовых значений.
UPDATE:
Я вроде как ответ Джеймса немного лучше, потому что он не требует импорта другого модуля, но метод Грэга быстрее:
>>> 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
Мой Hacky метод:
>>> Timer("sum(ord(c) << (i * 8) for i, c in enumerate('y\xcc\xa6\xbb'[::-1]))").timeit()
2.8819329738616943
ДАЛЕЕ UPDATE:
Кто-то спросил в комментариях, что это пр oblem с импортом другого модуля. Ну, импортируя модуль не обязательно дешевое, посмотрите:
>>> Timer("""import struct\nstruct.unpack(">L", "y\xcc\xa6\xbb")[0]""").timeit()
0.98822188377380371
Включая стоимость импорта модуля сводит на нет почти все преимущества, что этот метод имеет. Я считаю, что это будет включать только расходы на импорт его один раз для всего эталонного теста; Посмотрите, что происходит, когда я заставляю его перезагружать каждый раз:
>>> Timer("""reload(struct)\nstruct.unpack(">L", "y\xcc\xa6\xbb")[0]""", 'import struct').timeit()
68.474128007888794
Излишне говорить, что если вы делаете много выполнений этого метода на один импорт, чем это становится пропорционально меньше проблемы. Это также, вероятно, стоимость ввода-вывода, а не процессора, поэтому он может зависеть от характеристик емкости и нагрузки конкретной машины.
и импортировать что-то из стандартной библиотеки - это плохо, почему? – hop
andyway, duplicate: http://stackoverflow.com/questions/5415/convert-bytes-to-floating-point-numbers-in-python – hop
ваше «дальнейшее обновление» странно ... почему вы импортируете модуль так, чтобы довольно часто? – hop