Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python3中将字节解码为字符串或ASCII的问题_Python_Python 3.x_Decoding_Utf8 Decode_Bytestream - Fatal编程技术网

Python3中将字节解码为字符串或ASCII的问题

Python3中将字节解码为字符串或ASCII的问题,python,python-3.x,decoding,utf8-decode,bytestream,Python,Python 3.x,Decoding,Utf8 Decode,Bytestream,我在用Python3解码接收到的字节时遇到问题。我通过串行连接控制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

我在用Python3解码接收到的字节时遇到问题。我通过串行连接控制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\x82\x91\xb2\n'
,并尝试通过
myData.decode('utf-8')以通常的方式对其进行解码
我得到了一个错误
UnicodeDecodeError:“utf-8”编解码器无法解码位置1:无效起始字节中的字节0xb2。我尝试了其他编码(ASCII、cp437、hex、utf-16),但总是面临相同的错误

你有什么建议吗,我如何解码接收到的字节,或者arduino需要哪些解码?我已经尝试使用for循环逐段解码,但我总是面临相同的错误消息

有没有一个通用的方法来避免解码问题,或者找出我必须使用哪种解码


提前感谢。

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

这里有两个选项可供使用,第一个是struct模块:

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)

arduino发送的是什么类型的数据?你需要知道正确解码的编码是什么。查看发送数据的任何东西的文档,希望他们费心指定这些字节应该是什么。然后,在
块中解码数据,尝试
-
除了
块,然后编写一个错误处理函数来处理除了不可避免的例外…因为不管规范怎么说,你迟早会得到垃圾输入。你为什么认为这应该是文本数据?关于编码,为了人类的缘故,请在编写任何其他代码行之前阅读。但是编码看起来不像你的问题-这可能是二进制数据。我不可能这是ASCII码。看看所有以
8
开头的字节,通过
f
…这些字节都不是合法的ASCII码。
\x02
也很可疑。(你上次使用文本控制字符的开头是什么时候?)还有,里面隐藏了一个退格(
\x10
)。你的大部分挫折感都是由于字节和字符的混淆造成的。几十年前,它们非常相似,以至于老师们可以假装它们是同义词,但如今,字符显然是不同的生物。关于这些差异以及如何在Python中处理它们,最好的演示是PyCon 2012的36分钟讲座,“()。感谢您对二进制数据的解释,但第一个代码对我不起作用。当我将接收到的数据放入文件时,
read()
函数告诉我,'bytes'没有读取属性,它没有任何作用。您以前遇到过这个问题吗?第二种方法似乎可以正确地转换它。