Что это за дополнительные символы в моих байтовых строках?

#python #python-3.x #bluetooth

#python #python-3.x #bluetooth

Вопрос:

У меня есть скрипт на Python 3, который получает данные от некоторых датчиков Bluetooth LE. Данные, которые я получаю, представлены в 20-байтовых строках, но похоже, что наряду с обычными байтами есть несколько дополнительных символов x00 . Что это за дополнительные символы? Почему они находятся в, казалось бы, случайных местах в строке?

Вот фрагмент байтовых строк, которые я получаю от датчиков.

 b'x96x80Gx92x00x00xc0x7fx00x00xc0x7fx00x00xc0x7fx00x00xc0x7f'
b'xb1xc1Gx92x00x00xc0x7fx00x00xc0x7fx00x00xc0x7fx00x00xc0x7f'
b'xccx02Hx92x00x00xc0x7fx00x00xc0x7fx00x00xc0x7fx00x00xc0x7f'
b'xe7CHx92x00x00xc0x7fx00x00xc0x7fx00x00xc0x7fx00x00xc0x7f'
b'x02x85Hx92x00x00xc0x7fx00x00xc0x7fx00x00xc0x7fx00x00xc0x7f'
b'x1dxc6Hx92x00x00xc0x7fx00x00xc0x7fx00x00xc0x7fx00x00xc0x7f'
b'8x07Ix92x00x00xc0x7fx00x00xc0x7fx00x00xc0x7fx00x00xc0x7f'
b'SHIx92x00x00xc0x7fx00x00xc0x7fx00x00xc0x7fx00x00xc0x7f'
b'nx89Ix92x00x00xc0x7fx00x00xc0x7fx00x00xc0x7fx00x00xc0x7f'
  

Например, в первой строке есть фрагмент, который гласит x80G . Предпоследняя строка начинается с SHI . Что это значит?

Спасибо.

Комментарии:

1. Это двоичные данные, которые вы запросили. Вы должны прочитать документацию по датчику, чтобы понять, что это значит.

Ответ №1:

Как было указано в другом ответе, SHI это просто артефакт двоичных значений, выводимых на экран.

Есть несколько вариантов печати значений, чтобы этого не произошло:

 Python 3.7.3 (default, Dec 20 2019, 18:57:59) 
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> sensor_data = b'x53x48x49x92x00'
>>> sensor_data
b'SHIx92x00'
>>> list(sensor_data)
[83, 72, 73, 146, 0]
>>> [hex(x) for x in sensor_data]
['0x53', '0x48', '0x49', '0x92', '0x0']
>>> [f'{x:02x}' for x in sensor_data]
['53', '48', '49', '92', '00']
  

В Python 3.5 есть hex() метод bytes для вывода строкового объекта из шестнадцатеричных цифр. например

 >>> sensor_data.hex()
'5348499200'
>>> sensor_data.hex(' ')
'53 48 49 92 00'
  

Комментарии:

1. Примечание для OP и будущих посетителей: это просто представление двоичных данных. В конце концов, вы, вероятно, больше заинтересованы в интерпретации данных, поэтому представление имеет значение только для понимания человеком, пока вы пишете код, чтобы что-то с ним делать. Представление не имеет значения для компьютера.

Ответ №2:

Если байтовые данные представляют собой символ ASCII, то этот символ будет показан вместо xXX escape-кода. Так, например b'G' , совпадает с b'x47' , b'S' совпадает с и т.д. b'x53'

Что касается того, что на самом деле означает это значение, я не могу вам сказать. Я не знаком с протоколами, которые вы используете здесь.