使用python的分割函数进行奇怪的解码(例如:\ x00)

问题描述 投票:-1回答:1

这是一个非常奇怪的情况,split函数正在更改字符串格式。请看下面的代码,

代码:

COM_Port = serial.Serial(COM_PortName)
with COM_Port as port:
    while True:
         RxedData = port.readline()
         line = RxedData.decode('utf-8')
         print("Line 1: ", line)
         row = line.split(',')[1:-1]
         print("Line 2: ", row)

输出:

Line 1: "* , 0 0 0 0 0 5 7 5 , 2 3 : 0 3 : 4 7 , 1 1 / 0 2 / 2 0 , 1 2 . 3 4 5 , K P A , 0 0 0 0 6 . 8 3 , S L P M , T B ,                 , $ "

Line 2: ['\x000\x000\x000\x000\x000\x006\x002\x001\x00', '\x002\x000\x00:\x004\x006\x00:\x005\x001\x00', '\x001\x002\x00/\x000\x002\x00/\x002\x000\x00', '\x001\x002\x00.\x003\x004\x005\x00', '\x00K\x00P\x00A\x00', '\x000\x000\x000\x000\x000\x00.\x000\x000\x00', '\x00C\x00C\x00P\x00M\x00', '\x00T\x00G\x00', '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00']

Line 2如何进入\x000\x000...?这种编码格式是什么?如何将其转换为正确的格式?

python python-3.x encoding decoding
1个回答
0
投票

决定将我的评论变成答案(主要是为了让我包括代码)。

这两行的打印方式不同,因为您要打印不同的内容。在Line 1上,您将直接打印字符串,因此print函数(或控制台本身,不确定)可以显示ASCII字节作为其字符。在Line 2上,您现在正在打印一个列表,因此在print期间不会进行字节解释。

您的line字符串在解码后很可能在其中嵌入了\x00(NULL)字节而不是ASCII空格(\x20)。

>>> x = '*\x00,\x000\x000\x000\x000\x000\x005\x007\x005\x00'
>>> print(x)
'* , 0 0 0 0 0 5 7 5 ,'
>>> print(x.split(','))
['*\x00', '\x000\x000\x000\x000\x000\x005\x007\x005\x00']

要修改我引用的注释,这似乎是基于任何正在打印字符的控制台。我从cmd和PowerShell中获得了上述输出,但是Jupyter Notebook却打印了此输出:*,00000575。请注意,“空格”现在消失了。

[如果我将\x00的一些字节改为\x20,则Jupyter然后将打印您在上方看到的内容(至少在替换它们的位置)。这只是为了显示NULL字符和空格字符可以视觉上看起来完全相同,这取决于显示它们的控制台。

>>> x = '*\x20,\x200\x200\x000\x000\x000\x005\x007\x005\x00'
>>> print(x)
* , 0 0000575
© www.soinside.com 2019 - 2024. All rights reserved.