Преобразование байтов Python - PullRequest
       9

Преобразование байтов Python

0 голосов
/ 29 сентября 2019

Я запутался в обработке байта.

Мой фон кода связан с rs485-связью с измерителем тока.

hex_string - это команда, отправленная метру.

Я хочубайты конвертируются в строковую запись recv, пытаясь использовать recv.decode ("utf-8") в этом методе, но он недействителен.

Это переменная содержимого recv:

b '\ x05\ x03 \ x03 \ x00 \ x15 \ x88K '(байты) -> 0503020015884b (шестнадцатеричный)

Я хочу разобраться с этим абзацем: 0503020015884b (шестнадцатеричный).

Удалить 050302 и 884b,держите середину 0015 и конвертируйте 0015 в десятичную.

Как мне поступить?

#!/usr/bin/env python3.7
import serial,time
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BOARD)
GPIO.setup(40,GPIO.OUT)
GPIO.output(40,GPIO.LOW)

ser = serial.Serial(port='/dev/ttyS0',baurdate=9600,parity='N',bytesize=8,stopbits=2,timeout=1)
hex_string = '0503010000018472'
print ('\nType-hex_string',type(hex_string))

ser.reset_input_buffer()
ser.reset_output_buffer()

GPIO.output(40,GPIO.HIGH)

ser.write(bytes.fromehex(hex_string))
time.sleep(0.01)
GPIO.output(40,GPIO.LOW)
recv = ser.read(11)

print ('\nOrigin:',recv)
print ('\nType-Origin:,'type(recv))
print ('\nHex:',recv.hex())
print ('\nType-recv.hex():',type(recv))

Ответы [ 2 ]

0 голосов
/ 29 сентября 2019

Если у вас есть массив байтов как recv, вы можете преобразовать необходимые части в целое число следующим образом:

int(recv.hex()[6:10],16)

, где 6 и 10 - это диапазон, в котором у вас есть требуемое значение.

0 голосов
/ 29 сентября 2019

Вы можете использовать struct.unpack():

from struct import unpack

src = b'\x05\x03\x03\x00\x15\x88K'
res = unpack('>H', src[3: 5]))  # remove '>' if byte order is little endian

Также вы можете использовать struct.unpack_from():

res = unpack_from('>H', src, 3)

Вы можетеиспользуйте int.from_bytes():

res = int.from_bytes(src[3: 5], byteorder='big')
...