我有一个蓝牙控制器,可以在received_data
中返回事件的数据,其中3& 4字节一起是16位带符号的little-endian int值。
使用python2,其中str也是一个字节,我只是用struct.unpact
rotation_value = struct.unpack("<h", received_data[3] + received_data[4])[0]
这对python3不起作用,因为str和byte不是同一个东西
rotation_value = struct.unpack("<h", received_data[3] + received_data[4])[0]
TypeError: 'str' does not support the buffer interface
所以我的方法是将str转换为字节。
这是我尝试过的事情
print((received_data[3]+received_data[3]).encode('utf_16_le'))
print(received_data[3].encode('ISO-8859-1') + received_data[4].encode('ISO-8859-1'))
print(int.from_bytes(bytes([ord(c) for c in (received_data[3]+received_data[3])]), byteorder='little', signed=True))
print(struct.unpack("<h", bytearray(received_data[3] + received_data[4], 'cp1252'))[0])
但无论我怎么做,我都会收到类似这样的错误消息:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xef in position 3: invalid continuation byte
由于@PM 2Ring建议使用latin1
print(received_data[3].encode('latin1'))
哪个不起作用
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xca in position 3: invalid continuation byte
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb6 in position 3: invalid start byte
那究竟什么是以字节为单位转换这些假str的正确方法,最好是在python2&amp; 3.