最近在写一个采集PLC信号的程序。
用到了PyQt5的QTcpSocket类,接收到的数据类型为QByteArray。以前是用C++ 与QT写的时候,用得挺熟的,就想当然地用了C++的方法。
后来发现数据处理得不太理想,用type()函数一看, QByteArray 切片后,或者用at()提取的数据类型为python3自带的bytes类型。于是,便开始了bytes与其他数据类型的转换之旅
获得bytes
>> b = bytes.fromhex('9a12')
>> b
b'\x9a\x12'
>> import struct
>> c = struct.pack('B', 118)
>> c
b'v'
>> type(c)
bytes转int,byteorder为little时,处理的数据为 ‘\x12\x9a’ ,很适合处理plc通信的16位数据。
>>int.from_bytes(b, byteorder='big', signed=False)
39442
>>int.from_bytes(b, byteorder='little', signed=False)
4762
>>int.from_bytes(b, byteorder='big', signed=True)
-26094
bytes转字符串
>>'%04X' % int.from_bytes(b, byteorder='big', signed=False)
'9A12'
ASCII码与bytes,是不同的概念,如果bytes的值超过128,用ord()处理bytes可能会报错。
UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0x89 in position 0: ordinal not in range(128)