在python2中,我可以整天生成以字符串格式表示的这些十六进制字节'\x00\xaa\xff'
>>>’00'.decode('hex') + 'aa'.decode('hex') + 'ff'.decode('hex')
>>>'\x00\xaa\xff'
同样,我可以在 python3 中执行此操作
>>> bytes.fromhex(’00’) + bytes.fromhex(‘aa’) + bytes.fromhex(‘ff’)
>>>b'\x00\xaa\xff'
根据py2->py3的变化here https://docs.python.org/release/3.0.1/whatsnew/3.0.html#text-vs-data-instead-of-unicode-vs-8-bit
Python 3.0 使用文本和(二进制)数据的概念,而不是 Unicode 字符串和 8 位字符串。
所有文本均为 Unicode;然而,编码的 Unicode 表示为二进制数据。
因此,Py2 版本的输出是字符串,而 Py3 版本的输出是字节类型的二进制数据
但我真的需要一个字符串版本!
根据上述文档:
由于 str 和 bytes 类型不能混合,因此您必须始终在它们之间显式转换。使用 str.encode() 从 str 转换为字节,使用 bytes.decode() 从字节转换为 str。您还可以分别使用bytes(s,encoding=...)和str(b,encoding=...)。
好吧,现在我必须解码这个字节类型的二进制数据......
>>> b'\x00\xaa\xff'.decode()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xaa in position 1: invalid start byte
哎呀!我在这里不关心 UTF-8 编码。
我可以得到一个虚拟的直通编解码器吗?
PS
为什么我需要'\x00\xaa\xff'
代替b'\x00\xaa\xff'
?
因为我正在把这个字符串传递给
a crc function https://github.com/gtrafimenkov/pycrc16/blob/master/python2x/crc16/crc16pure.py用纯Python编写
crc16pure.crc16xmodem('\x00\xaa\xff')
该函数期望迭代由字节组成的字符串。
如果我给出这个函数b'\x00\xaa\xff'
那么这只是一个不能迭代的数字。