解决基于MIDI的Python 3 Bytes对象的问题

时间:2014-08-24 03:09:39

标签: python unicode utf-8 decode encode

我正在处理Python 3中的以下字符串。

b'\xf9', b'\x02', b'\x03', b'\xf0', b'y', b'\x02', b'\x03', b'S', b'\x00', b't', b'\x00', b'a'

这对我来说是一个非常令人困惑的字节串,因为它来自一个根据MIDI协议发出信息的微控制器。

我的第一个问题是关于最后的字母。大多数其他bytes都是真正的十六进制值(即我知道b'\x00'应该是一个空字符)。然而,应该是大写字母S的资本S看起来是这样的(a b'S')。根据我看过的ASCII / HEX图表,大写S应为x53(这是b'\x53'.decode('utf-8')返回的内容。

然而,在我做b'S'.decode('utf-8')的Python时,它也会返回人均S,(两者又怎么样?)

此外,一些字节(例如b'\xf9')确实意味着要进行转义(这就是为什么它们有\x但是,我在尝试解码时遇到了问题。在上述字符串的较长版本上运行[byteString].decode('utf-8')我收到以下错误:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xf9 in position 0: invalid start byte

不应该跳过或打印这些字节吗?感谢

1 个答案:

答案 0 :(得分:1)

他们返回同样的东西,因为b'\x53' == b'S'。它与ASCII表中的其他字符相同,因为它们由相同的字节表示。

您正在获得UnicodeDecodeError,因为您似乎使用了错误的编码。如果我运行b'\xf9'.decode('iso-8859-1'),我会ù,因此编码可能是ISO-8859-1。

但是,我不熟悉MIDI协议,因此您必须查看它以查看需要将哪些字节解释为什么编码。如果将所有给定的字节解码为ISO-8859-1,它不会给我一个有意义的字符串,这可能意味着这些字节代表其他东西,而不是文本?