我试图从RS-232端口传输的字节字符串中提取数值。举个例子:
b'S\xa0S\xa0\xa0\xa0\xa0\xa0\xa0\xb23.6\xb7\xa0\xe7\x8d\n'
如果我尝试将字节字符串解码为“utf-8”,我将收到以下输出:
x = b'S\xa0S\xa0\xa0\xa0\xa0\xa0\xa0\xb23.6\xb7\xa0\xe7\x8d\n'
x.decode('utf-8', errors='ignore')
>>> 'SS3.6\n'
理想情况下我想要的是23.67,这是在每个\xb
模式之后观察到的。如何从这个字节字符串中提取23.67?你知道吗
正如在https://stackoverflow.com/a/59416410/3319460中提到的,您的输入实际上并不代表您所寻求的输出。当然,为了满足您的需求,我们可以对输入设置语义,以便
'.'
符号,跳过其他符号0xB
。如果是这样的话,那么我们将只取字节的ASCII部分(b & 0b01111111
)用Python很容易做到这一点。你知道吗
请注意尽管上面的代码满足要求但这是一个描述不好的任务的例子,因此是一个非常荒谬的解决方案。代码按照您的要求解决了任务,但我们应该首先重新考虑它是否有意义。我建议您检查您要测试的数据和数据的含义(协议)。你知道吗
祝你好运:)
请注意,
\xHH
是表示十六进制值HH
的转义码,因此您的字符串'\xb23.6\xb7'
不包含"23.67"
,但是rater"(0xB2)3.6(0xB7)"
,这些值不能使用正则表达式提取,因为它首先不在字符串中。你知道吗'\xb23.6\xb7'
不是一个有效的UTF-8序列,在Latin-1 extended ASCII中它代表"²3.6·"
;许多0xA0
值的存在表明是拉丁-1编码,因为它在该编码中代表一个不间断的空格(一个相当常见的字符),而在UTF-8中它不编码有意义的序列。你知道吗如果您只想从该字节字符串中获取23.67,请尝试以下操作:
相关问题 更多 >
编程相关推荐