gpt4 book ai didi

Python 3 - 解码包含十六进制和 unicode 混合的字节

转载 作者:行者123 更新时间:2023-12-01 07:47:27 26 4
gpt4 key购买 nike

我正在移植a codebase for the Lasersaur laser cutter从 Python2 到 Python3,我在解码来自板载 Arduino 的串行数据时遇到了一些麻烦。数据以混合十六进制和 unicode 数据的字节流形式出现,如下所示:

bytes: b'AC\xfb\xff\xff\xbfx\x85\x80\x80\xc0y\x80\x80\x80\xc0z'
data: A C 251 255 255 x 133 128 128 y 128 128 128 z

Python2 能够对混合类型数据进行压倒性处理,并将串行数据作为字符串读取,之后使用 ord() 来确定该字符是否代表数据或状态字符。您可以看到这是如何在从 line 367 here 开始的原始 Python2 代码中实现的。 .

ord(data): 65 67 251 255 255 120 133 128 128 121 128 128 128 122

Python3 对编码更加严格,当我尝试 bytes.decode('utf-8') 时,会抛出以下错误,因为它到达第一个十六进制数据 b' x\fb' 和窒息,因为它是一种不同的格式。尝试使用几种不同的编解码器并不会产生更好的结果。

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

我找到了this StackOverflow thread它几乎完全满足了我的需要,但似乎 Python 3 中的错误处理不再相同,并且当我在那里尝试解决方案时抛出此错误: TypeError: 'UnicodeDecodeError' object is not subscriptable.

我可以修改 Arduino 上的板载代码以获得更健全的串行编码,但我移植到 Python3 的主要原因是我无法获得正确的(阅读:旧的)Python2 库来执行代码,我不想遇到这样的情况:我无意中进入了无法与板载 arduino 通信的状态。

我想做的是尽可能模仿原始功能,并得到一个可以调用 ord() 的字符字符串,或者字符和字符的混合列表中的数字。我有点不知道如何做到这一点。

最佳答案

您没有“混合”数据,您有一个字节对象。当你打印它时,Python将其值对应于ASCII中的字母的所有字节都表示为一个字母,以帮助我们识别其中的文本。

您可以通过索引将任何单个字节作为整数访问:

data = b'AC\xfb\xff\xff\xbfx\x85\x80\x80\xc0y\x80\x80\x80\xc0z'

print(data[0])
# 65

该值以整数形式返回。 (这里,65,对应于 ASCII 中的“A”,因此它在字节字符串中表示。)

因此,将字节转换为整数列表的简单方法是:

data_as_int = [b for b in data]

或者更简单:

data_as_int = list(data)

这给了我们:

print(data_as_int)
# [65, 67, 251, 255, 255, 191, 120, 133, 128, 128, 192, 121, 128, 128, 128, 192, 122]
<小时/>

关于将字节转换为字符串,以便之后使用 ord 的想法:您可以做到这一点,但您必须使用像 latin1 这样的编码每个字节对应一个字符 - 而 utf8 则不是这种情况。所以,你可以这样做:

data_as_int = [ord(c) for c in data.decode('latin1')]

但这比上面的解决方案不太直接。

关于Python 3 - 解码包含十六进制和 unicode 混合的字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56400536/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com