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

4
在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的变化(此处),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',那么这只是一个数字,不能进行迭代。


1
这里有一个问题吗? - Error - Syntactical Remorse
如果你正在编写操作任意字节的代码,那么你应该使用 bytes 类型。如果你正在编写操作文本的代码,那么你应该使用 str 类型。 - Mark A
@错误-语法悔恨 问题在标题中。 - Jordan Lee
1个回答

12

问题:我能否只获取一个虚拟的透传编解码器?

答案:是的,请使用iso-8859-1

在Python3中,以下内容无法工作

b'\x00\xaa\xff'.decode()

默认编解码器"utf-8"无法解码字节0xaa。

如果您不关心字符集(例如,print()时看到的字符),只想要像在python2中获得的8位字符串,则使用8位编解码器iso-8859-1

b'\x00\xaa\xff'.decode('iso-8859-1')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接