如何解码包含无效字节的字节对象,Python3

时间:2019-05-23 20:36:05

标签: python-3.x string decode encode bytestring

在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',那么那只是一个不能迭代的数字。

1 个答案:

答案 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')