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

Надеюсь, что это все еще полезно.

Другие вопросы по тегам