Я пытаюсь преобразовать строку байтов/шестнадцатеричных в int.
У меня есть текстовый журнал данных, возвращенных считывателем последовательного порта, это связано с радиацией. Записи в журнале такие:
<20110805104053.421>
#00#00#64#05#00#00#00#00#00#00#3C#00#00#0D#0A
<20110805104055.421>
#00#00#5AÉ#00#00#00#00#00#00#3C#00#00#0D#0A
20110805104057.421>
#00#00#60÷#00#00#00#00#00#00#3C#00#00#0D#0A
<20110805104059.421>
#00#00#59#1C#00#00#00#00#00#00#3C#00#00#0D#0A
<20110805104101.421>
#00#00#5D#56#00#00#00#00#00#00#3C#00#00#0D#0A
<20110805104103.421>
#00#00#5D#09#00#00#00#00#00#00#3C#00#00#0D#0A
Формат:
<TIMESTAMP (YYYY,MM,DD,HHMMSS.SS)>
DATA
В этом случае с данными используются только первые 4 хэша (или около того):
#00#00#5D#56
Форматируя строку и используя код:
>>> logdata = b'\x00\x00\x5D\x56'
>>> struct.unpack(">l", logdata)
(23894,)
>>> int(binascii.hexlify(bytearray(logdata)),16)
result: 23894
Эти числа являются ожидаемыми, однако иногда строка сохраняется в специальных символах:
<20110805104055.421>
#00#00#5AÉ#00#00#00#00#00#00#3C#00#00#0D#0A
Используя тот же метод набора, что и выше, я конвертирую первые 4 в:
#00#00#5AÉ#00 or ('\x00\x00\x5AÉ\x00')
Ожидаемый результат (из http://www.asciitohex.com/):
23040
Мой первый результат:
5949696
Что неверно, поэтому я настраиваю байты на '\x00\x00\x5AÉ'
и запускаю снова, это дает мне:
23241
Что очень близко к 23040, но не к 23040??? Это довольно воспроизводимо с помощью ряда чисел, но не правильно. Когда я не использую специальные символы, мои результаты соответствуют ожиданиям и преобразуются на веб-сайте asciitohex.