在Python2中,我可以轻松地以字符串格式生成这些十六进制字节,例如:
根据py2->py3的变化(此处),Python 3.0使用文本和(二进制)数据的概念代替Unicode字符串和8位字符串。所有文本都是Unicode;然而,编码的Unicode被表示为二进制数据。因此,在Py2版本中,输出是一个字符串,而在Py3版本中,它是类型为bytes的二进制数据。但我确实需要一个字符串版本!根据上述文档,由于str和bytes类型不能混合使用,您必须始终在它们之间明确地进行转换。使用str.encode()将从str转换为bytes,使用bytes.decode()将从bytes转换为str。您也可以分别使用bytes(s, encoding=...)和str(b, encoding=...)。好的,现在我必须解码这个类型为bytes的二进制数据...
'\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的变化(此处),Python 3.0使用文本和(二进制)数据的概念代替Unicode字符串和8位字符串。所有文本都是Unicode;然而,编码的Unicode被表示为二进制数据。因此,在Py2版本中,输出是一个字符串,而在Py3版本中,它是类型为bytes的二进制数据。但我确实需要一个字符串版本!根据上述文档,由于str和bytes类型不能混合使用,您必须始终在它们之间明确地进行转换。使用str.encode()将从str转换为bytes,使用bytes.decode()将从bytes转换为str。您也可以分别使用bytes(s, encoding=...)和str(b, encoding=...)。好的,现在我必须解码这个类型为bytes的二进制数据...
>>> 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编码。
我能否只获得一个虚拟的直通编解码器?
附言
为什么我需要'\x00\xaa\xff'
而不是b'\x00\xaa\xff'
?
因为我将此字符串传递给一个纯Python编写的CRC function。
crc16pure.crc16xmodem('\x00\xaa\xff')
这个函数期望迭代由字节组成的字符串。
如果我给出b'\x00\xaa\xff'
,那么这只是一个数字,不能进行迭代。
bytes
类型。如果你正在编写操作文本的代码,那么你应该使用str
类型。 - Mark A