【问题标题】:Issues decoding a Python 3 Bytes object based on MIDI基于 MIDI 解码 Python 3 字节对象的问题
【发布时间】:2014-08-24 03:09:38
【问题描述】:

我正在处理 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 显示为这样(b'S')。根据我看过的 ASCII / HEX 图表,大写 S 应该是 x53(这是 b'\x53'.decode('utf-8') 返回的内容。

但是,在 Python 中,当我执行 b'S'.decode('utf-8') 时,它也会返回一个人头 S,(怎么可能两者兼有?)

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

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

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

【问题讨论】:

    标签: python unicode utf-8 decode encode


    【解决方案1】:

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

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

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

    【讨论】:

    • 我明白了。谢谢您的回答。你能帮我(因为我还在搞定 Python)吗?因此,在作为一条消息接收的那个字节串中,只有第二个b'\x02', b'\x03' 之后的字符需要解码为 utf-8。 (如果发生这种情况,字符串是有意义的)。有没有办法解码字节字符串的一部分,而不是全部?
    • @Startec:切出你想要的部分然后解码。
    猜你喜欢
    • 2016-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-14
    • 2017-11-22
    • 1970-01-01
    • 2011-11-21
    • 2015-10-06
    相关资源
    最近更新 更多