【问题标题】:Problems with decoding bytes into string or ASCII in python 3在 python 3 中将字节解码为字符串或 ASCII 的问题
【发布时间】:2016-05-11 23:38:57
【问题描述】:

我在使用 python 3 解码接收到的字节时遇到问题。我正在通过串行连接控制 arduino 并使用以下代码读取它:

import serial
arduino = serial.Serial('/dev/ttyACM0', baudrate=9600, timeout=20)
print(arduino.isOpen())
myData = arduino.readline()
print(myData)

我得到的结果看起来像b'\xe1\x02\xc1\x032\x82\x83\x10\x83\xb2\x80\xb0\x92\x0b\xa0'b'\xe1\x02"\xe1\x00\x83\x92\x810\x82\xb2\x82\x91\xb2\n' 并尝试通过myData.decode('utf-8') 以通常的方式对其进行解码,但我收到错误UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb2 in position 1: invalid start byte。我尝试了其他解码(ASCII、cp437、十六进制、utf-16),但总是遇到同样的错误。

您有什么建议,我如何解码接收到的字节或 arduino 需要哪种解码?我已经尝试使用 for 循环逐段解码它,但我总是遇到相同的错误消息。

有没有一种通用的方法可以避免解码问题或找出我必须使用哪种解码?

提前致谢。

【问题讨论】:

  • arduino 发送什么样的数据?
  • 您需要知道编码是什么才能正确解码。查看发送数据的任何内容的文档,并希望他们费心指定这些字节应该是什么。然后,解码try-except 块中的数据,并编写一个错误处理函数来处理不可避免的异常......因为无论规范怎么说,你迟早都会收到垃圾输入。
  • 为什么你认为这应该是文本数据?关于编码,为了人类,请在编写任何其他代码行之前阅读joelonsoftware.com/articles/Unicode.html。但是编码在这里看起来不像您的问题 - 这可能是二进制数据。
  • 没有 方式 是 ASCII。查看以8f 开头的所有字节......这些字节中的none 是合法的ASCII。 \x02 也很可疑。 (you 上一次使用 Start-Of-Text 控制字符是什么时候?)另外,还有一个 Backspace 隐藏在其中 (\x10)。
  • 您的大部分挫败感是由于将 bytescharacters 混为一谈造成的。几十年前,它们非常相似,以至于老师可以假装它们是同义词,但如今,角色显然是不同的生物。对这些差异以及如何在 Python 中处理它们的最佳演示是 Ned Batchelder 在 PyCon 2012 上的 36 分钟讲座,“Pragmatic Unicode, or, How Do I Stop the Pain?” (on You Tube)。

标签: python python-3.x decoding utf8-decode bytestream


【解决方案1】:

正如@jsbueno 在 cmets 中所说,这不是解码问题,可能是因为接收到的字节数据实际上是二进制数据。从文件中读取二进制数据(字节)时,我遇到了一个非常相似的问题。

这里有两个选项可以使用,第一个是结构模块:

import struct
a = open("somedata.img", "rb")
b = a.read(2)  
file_size, = struct.unpack("i",a.read(4))

以这种方式编写代码会产生一个元组,因此要获得一个整数,只需使用struct.unpack('i', a.read(4))[0]

如果要将数据存储在 numpy 数组中,我使用的另一种方法是:

import numpy as np

f = open("somefile.img", "r")
a = np.fromfile(f, dtype=np.uint32)

【讨论】:

  • 感谢您对二进制数据的解释,但第一个代码对我不起作用。当我将接收到的数据放入文件时,read() 函数告诉我,“字节”没有读取属性,它什么也没做。你以前遇到过这个问题吗?第二种方法似乎可以正确转换它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-22
  • 2011-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-05
相关资源
最近更新 更多