为串行设备创建/格式化十六进制值字符串
Posted
技术标签:
【中文标题】为串行设备创建/格式化十六进制值字符串【英文标题】:creating/formatting string of hex values for serial device 【发布时间】:2020-11-04 18:29:06 【问题描述】:我正在使用 2.7 上的一些旧 Python 代码,通过 python 串行库向 FTDI 设备发送和接收数据。
例如,十六进制数据以字节文字字符串转义发送
ser.write(b"\x02\x27\x01")
以类似的格式返回响应。
我有一个计算密码的函数,我需要以字符串格式发送响应。 b"\xnn"
其中 nn 是十六进制值。
因此尝试以以下方式制作响应(代码是现有程序的一部分),这是失败的
在哪里
high = 0x54
low = 0xd3
key_answer="\x04\x27\x02"+chr(int(high)).encode('latin1')+chr(int(low)).encode('latin1')
它失败了:
Message='ascii' codec can't decode byte 0xd3 in position 0: ordinal not in range(128)
如果我只使用 chr()
函数,我会得到
"\x04'\x02**T**\xd3"
其中高值应该是 \x54
而不是字符 T
。
所以问题是:如何强制将十六进制值的格式从 0a54
格式转换为字符串文字 '\x54'
?
【问题讨论】:
Python 2.7 尝试“提供帮助”并将字节转换为字符串,反之亦然。它使用 ASCII 编解码器来做到这一点,这几乎总是错误的选择。要解决此问题,请在使用字节和字符串方面保持一致。chr(x)
创建一个字符串。
【参考方案1】:
使用我的编解码器all-escapes
,它就是为这个用例而设计的。
pip install all-escapes
最简单的演示:
>>> b"T".decode("all-escapes")
"\\x54"
您的案例的完整用法示例:
>>> key_answer = b"\x04\x27\x02"
>>> b = bytearray(key_answer)
>>> b.extend([high, low])
>>> print(b)
bytearray(b"\x04\'\x02T\xd3")
>>> print(b.decode('all-escapes'))
\x04\x27\x02\x54\xd3
【讨论】:
以上是关于为串行设备创建/格式化十六进制值字符串的主要内容,如果未能解决你的问题,请参考以下文章