Как декодировать радарные данные, прочитанные Python / сокетом, например, b '\ x08 \ x00 \ x00 \ x00' в числа - PullRequest
0 голосов
/ 08 мая 2019

Я разрабатываю программу на Python3 для обработки данных с радаров. В общем, радар отправляет данные (шестнадцатеричные числа) на порт моего компьютера, и я использую сокет для прослушивания этого порта. И используйте код ниже, чтобы получить 4 байта данных.

data = connection.recv(4)
print(data)

При тестировании моей программы радар отправляет 08 00 00 01 и печатает программу b'\x08\x00\x00\x01'. Я понимаю, что '\ x' означает, что рядом с символами находится шестнадцатеричное число, но я хочу получить из него числа типа [08, 00, 00, 01] или обычную строку. Пробовал самый очевидный способ:

strData = data.decode()
print(strData.split('\x'))

Ошибка при SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 0-1: truncated \xXX escape.

И ситуация ухудшается, если радар отправит 08 0D 00 00, print(data) напечатает b'\x08\r\x00\x00', что заставляет меня понять, что строковые операции не могут решить эту проблему.

Итак, как правильно преобразовывать байты, такие как b'\x08\x00\x00\x01', в числа, подобные 08 00 00 01.

Строковое кодирование сводит меня с ума -.- Хотя я использую Python3, решения на Python2.7 тоже подойдут. Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 09 мая 2019

Для этого конкретного случая - у вас есть строка байтов, и вы хотите преобразовать каждый байт в его целочисленный эквивалент - вы можете преобразовать строку байтов непосредственно в список.

>>> bs = b'\x08\x00\x00\x01'
>>> ints = list(bs)
>>> ints
[8, 0, 0, 1]

Это работает, потому что

байтовые объекты фактически ведут себя как неизменяемые последовательности целых чисел

так

[Для] объекта байтов b, b [0] будет целым числом, в то время как b [0: 1] будет объектом байтов длины 1. (Это отличается от текстовых строк, где и индексирование, и нарезка будут производить строка длиной 1)

(Цитаты из документов для типа bytes).

0 голосов
/ 08 мая 2019

Полагаю, вы уже получили двоичные данные. Если вам действительно нужно шестнадцатеричное представление в виде строки, этот ответ на аналогичный вопрос может вам помочь.

Если вы хотите интерпретировать данные как, например, число с плавающей запятой, можно использовать struct

import struct
x = struct.unpack('f',data)
...