2016-02-07 1 views
1

Может ли кто-нибудь помочь со следующей строкой кода и ошибкой? Я не знаком с преобразованиями значений python.Ошибки python struct.unpack с TypeError: необходим байтовый объект, а не 'str'

Удельная линия, которая генерирует ошибку является:

value = struct.unpack("<h",chr(b)+chr(a))[0] 

TypeError: требуется байт-подобный объект, не 'ул'

фрагмент кода:

    if packet_code ==0x80: # raw value 
         row_length = yield 
         a = yield 
         b = yield 
         value = struct.unpack("<h",chr(b)+chr(a))[0] 

Входные данные:

b'\x04\x80\x02\x00\xb2\xcb\xaa\xaa\x04\x80\x02\x00p\r\xaa\xaa\x04\x80\x02\x00] \xaa\xaa\x04\x80\x02\[email protected]=\xaa\xaa\x04\x80\x02\x007F\xaa\xaa\x04\x80\x02\x00\!\xaa\xaa\x04\x80\x02\[email protected]\xaa\xaa\x04\x80\x02\[email protected]\xaa\xaa\x04\x80\x02\x00i\x14\xaa\xaa\x04\x80\x02\x00] \xaa\xaa\x04\x80\x02\x00p\r\xaa\xaa\x04\x80\x02\x00\x80\xfd\xaa\xaa

Я использую python 3.5. Этот код, похоже, работает в более старых версиях.

Вот ссылка на подобный код парсера, где он, возможно, работал с предыдущими версиями Python: Parser Code Link

Here is the link to the description of how the data is sent from the device RAW Wave Value (16-битовым)

Это значение данных состоит из два байта и представляет собой образец необработанной волны. Его значение представляет собой подписанное 16-разрядное целое число, которое находится в диапазоне от -32768 до 32767. Первый байт значения представляет собой старшие биты значения двух комплиментов, тогда как второй байт представляет младшие разряды. Для того, чтобы восстановить полное необработанное значение волны, просто сместить первые байты влево на 8 бит, а побитовый или со вторым байтом:

short raw = (Value[0]<<8) | Value[2]; 

, где Значение [0] является высоким порядком байты, и значение 1 является младший байт.

В системах или языках, где битовые операции неудобны, следующие арифметические операции могут быть заменены вместо:

raw = Value[0]*256 + Value[1]; 
if(raw >= 32768) raw = raw - 65536; 

Действительно ценим любую помощь, как я в настоящее время застрял.

ответ

2

Когда вы используете Python 2.x str является массивом байтов. Для Python 3 вы должны использовать bytes следующим образом:

struct.unpack("<h", bytes([b, a]))[0]