Python разбивает байт на верхний и нижний кусочки
Я пытаюсь отправлять и получать данные RS232 с помощью Pyserial, но я не понимаю, как правильно отправить правильные данные. То небольшое количество информации, которое у меня есть, объясняет строку данных и говорит о том, что она должна быть разбита на высокий и низкий клев. Преобразование в клев - это та часть, которую я не понимаю, я пытался прочитать об этом, но не понимаю, как это использовать в моем случае.
Итак, у меня есть эта строка данных для отправки через последовательный порт. 10,00,00,00,00,00,16,0A,20,20,20,20,00,00,00,00,00,00,00,00,50
В нем говорится, что для разделения байтов на верхний и нижний отрывки 21 байт затем преобразуется в строку данных из 42 символов.
Может ли кто-нибудь помочь объяснить, как это сделать для меня?
1 ответ
Если вы хотите получить верхний и нижний кусочек байта. Другими словами, разбить 8 бит на 4 бита.
Учитывая, что строка данных представляет собой строку байтов в шестнадцатеричном формате, вы можете просто сделать:
high, low = byte[:1], byte[1:2]
print(high, low)
Для чего byte = "16"
будет печатать 1 6
, Вы можете использовать int(high, 16)
а также int(low, 16)
преобразовать его в десятичные дроби.
Если вы уже преобразовали шестнадцатеричное в десятичное число, используя int(byte, 16)
тогда вы можете извлечь верхний и нижний клев, выполнив:
high, low = byte >> 4, byte & 0x0F
print(hex(high), hex(low))
Для чего byte = 0x16
будет печатать 0x1 0x6
потому что они преобразуются обратно в шестнадцатеричные с использованием hex(x)
, Обратите внимание, что hex(x)
добавляет 0x
префикс. Вы можете удалить его, выполнив hex(x)[2:]
,
Итак, учитывая вашу строку данных как:
bytes = "10,00,00,00,00,00,16,0A,20,20,20,20,00,00,00,00,00,00,00,00,50"
Затем напечатать каждый верхний и нижний кусочек можно было бы примерно так:
bytes = "10,00,00,00,00,00,16,0A,20,20,20,20,00,00,00,00,00,00,00,00,50"
bytes = bytes.split(",")
for byte in bytes:
byte = int(byte, 16)
high, low = byte >> 4, byte & 0x0F
print(hex(byte), hex(high), hex(low))
Который дает байт, высокий клев и низкий клев в шестнадцатеричном формате.
Также, если у вас есть это в битах ("{0:08b}".format(byte)
) тогда вы можете разделить это так high, low = bits[:4], bits[4:8]
, сейчас high, low
у каждого свои 4 бита.
Я не знаю, поможет ли вам ответ сейчас, но вы также можете решить эту проблему с помощью так называемой битовой маски
например, разделите каждый символ из строки на верхний полубайт (hl) и младший полубайт (ln) с помощью python:
input_text = "a fucking amazing input text"
for c in input_text:
print(bin(ord(c)))
nh = ord(c) & 0x0F
nl = ord(c) >> 4 & 0x0F
print("nh: " + bin(nh))
print("nl: " + bin(nl))
Почему 0x0F, это 00001111
Например:
Маска: 00001111 (0x0F) Значение: 11010101 Результат: 00000101
Надеюсь, что это все еще полезно.