Hex Dump (массив байтов) с нестандартными символами в int

Я пытаюсь преобразовать строку байтов/шестнадцатеричных в 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.


person Royalke    schedule 15.12.2014    source источник


Ответы (1)


É — это шестнадцатеричный код C9.

0x5AC9 is 23241

Если бы это было È (это шестнадцатеричный C8), вы получили бы 23240.

[См. http://www.pjb.com.au/comp/diacritics.html]

Похоже, что иногда, когда шестнадцатеричный код можно интерпретировать как печатный символ, такой как É, этот символ выводится вместо шестнадцатеричного. В случае «#00#00#5AÉ#00» вам не нужна строка «\x00\x00\x5AÉ\x00», потому что это 5 байтов, а не четыре (вы можете сказать, потому что после захвата должно остаться 11 байтов). что вы хотите не 10) вы хотите только '\x00\x00\x5AÉ'=5AC9.

person hft    schedule 15.12.2014
comment
так как же веб-сайт asciitohex.com интерпретирует x00\x00\x5AÉ\x00 как 23040? Проблема в том, что есть уже преобразованная диаграмма значений радиации, с которой я сравниваю, и 23040 — это результат, который она также получает. - person Royalke; 16.12.2014
comment
Я не уверен, почему этот веб-сайт говорит вам это. Что именно вы вводите в форму сайта, чтобы получить 23040? - person hft; 16.12.2014
comment
добавляя к этому, я также собираюсь сказать, что преобразованные значения QA/QC неверны, а ваш метод верен (некоторые значения #00#00Ÿñ#00 оказываются равными 0) - person Royalke; 16.12.2014