在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
Python 3.0使用文本和(二进制)数据的概念代替了Unicode字符串和8位字符串。 所有文本均为Unicode;但是,编码的Unicode表示为二进制数据。
因此,对于Py2版本,输出为字符串,而Py3版本的输出为字节类型的二进制数据
但是我真的需要一个字符串版本!
根据上述文档:
由于不能将str和byte类型混合使用,因此必须始终在它们之间进行显式转换。使用str.encode()从str扩展到字节,并使用bytes.decode()从字节扩展到str。您也可以分别使用byte(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'
?
因为我要使用此字符串并将其传递到
使用纯Python编写的crc function
crc16pure.crc16xmodem('\x00\xaa\xff')
该函数希望遍历由字节组成的字符串。
如果我给函数b'\x00\xaa\xff'
,那么那只是一个不能迭代的数字。
答案 0 :(得分:0)
问题:我能否得到一个虚拟的直通编解码器?
答案:是的,使用iso-8859-1
在python3中,以下操作无效
b'\x00\xaa\xff'.decode()
默认编解码器'utf-8'无法解码字节0xaa
只要您不关心字符集(例如,在print()
时看到的字符),只想要一串8bit字符,就像在python2中会得到的一样,然后使用8bit编解码器iso-8859-1
b'\x00\xaa\xff'.decode('iso-8859-1')