Вы можете сделать это с небольшим количеством математики: вы можете получить последние четыре бита вашего байта с b % 16
, а первые четыре с целочисленным делением на 16. Тогда вам просто нужно объединить обе части.
Обратите внимание, что вы получаете целые числа при индексации / итерации в байтовом объекте.
Итак:
test=b"\x05\x08\x06\x04\x01\x05"
result=b"\x50\x80\x60\x40\x10"
out = bytes((test[i]%16)*16 + test[i+1]//16 for i in range(len(test)-1))
print((out))
# b'P\x80`@\x10'
(Поскольку некоторые значения соответствуют кодам ASCII печатных символов, эти символыздесь печатаются вместо \x..
представления)