【问题标题】:How to not automatically convert byte to ascii in python如何在python中不自动将字节转换为ascii
【发布时间】:2016-03-07 01:16:25
【问题描述】:

我正在使用 Python 从 UART 读取一些字节,

但是 Python 正在将我的一些字节转换为 ascii。这会导致问题,因为因此我得到了错误的小数。

import serial
import time

port = serial.Serial("dev/ttyAMA0",baudrate=115200,timeout=1.0)

while True:

    port.write(bytearray([0xAA,0x90,0x3B,0x85]))

    answ = port.read(size=8)
    print (answ)

我得到的答案是:

b'\xaa\x10\xb1?\x86ff\x85'

但我期望:

b'\xaa\x10\xb1\?\x86\f\f\x85'

问题在于 ff 的值与 f f 不同。

【问题讨论】:

  • 您的期望不是 Python 中字节的正确表示。我不确定那应该是什么。
  • 如果 'port.read()' 给你字节。你能把它打印成一个列表吗?字节和字符串之间总是存在问题。

标签: python hex bytearray ascii


【解决方案1】:

显示值只是数据的表示。有效 ASCII 的数据会显示 ASCII 字符,但字节实际上是:

>>> answ = b'\xaa\x10\xb1?\x86ff\x85'
>>> for i in answ: print(hex(i))
...
0xaa
0x10
0xb1
0x3f
0x86
0x66
0x66
0x85

这就是你要找的吗?

【讨论】:

  • 是和否...部分 '?\x86ff' 等于 63134255 作为十进制数,但 'x3fx86x66x66' 等于 63134102102 作为十进制数。你明白我的问题吗?
  • @EisBaer,​​ `hex(63134255) == '0x3c35a2f',所以这没有任何意义。
  • 对不起,我收到的字节将被转换为小数。 0xaa, 0x10, 0xb1 和 0x85 只是一个 start, stop, errorbyte....
  • @EisBaer,仍然显示的字节是您声称实际收到的字节,它们与您的期望无关。您可能需要显示更多代码,以及十进制转换,并记录协议以便对我们有意义。
  • 抱歉,我发现我的问题是什么!我使用的是在线转换器,并没有对整个事情进行编码。现在我想我确实了解 bytearrays 是如何工作的......
【解决方案2】:

字节数组,顾名思义,是一个字节数组。当您收到数据时,您将获得发送的确切字节,然后将其存储在您的 answ 变量中。但是,当您打印到屏幕时,python 假定为 ASCII 编码,因此任何可打印字符都打印为该字符而不是十六进制,但它们实际上与以下代码相同 sn-p显示:

a = b"f"
b = b"\x66"
if a == b:
    print("Same")
else:
    print("different")

这将打印“Same”,您可以在此处查看实际操作:http://ideone.com/6980Ty

查找 ascii 表以了解转换是如何进行的。如果您使用的是 linux,请在终端输入 man ascii 以查看此内容。

【讨论】:

    猜你喜欢
    • 2018-02-15
    • 2017-12-25
    • 1970-01-01
    • 2018-08-28
    • 1970-01-01
    • 2020-08-09
    • 1970-01-01
    • 2014-05-06
    • 2012-05-16
    相关资源
    最近更新 更多