将输入十六进制 0A 转换为 \n 转义字符
Posted
技术标签:
【中文标题】将输入十六进制 0A 转换为 \\n 转义字符【英文标题】:Converting input hex 0A to \n escaped character将输入十六进制 0A 转换为 \n 转义字符 【发布时间】:2021-06-11 18:52:11 【问题描述】:我正在使用网页以十六进制获取数据以使用 python 编写串行 modbus
问题是字符串中的0A
被转换为\n
。
如何阻止这种情况发生?
rList = r'0106000600000AE9CC'
arr=str(rList)
arr = bytes.fromhex(rList)
print(arr)
输出:
b'\x01\x06\x00\x06\x00\x00\n\xe9\xcc'
【问题讨论】:
字符的十六进制值是0A
,Python在显示字节串的表示时只是将其显示为转义字符。
【参考方案1】:
字节对象的 repr() 表示尽可能使用 ASCII 代码点。
这意味着\x0A
将显示为\n
,因为这是换行符的 ASCII 代码点。
更多示例:\x55
将显示为U
,\x5A
将显示为Z
,\x0D
将显示为\r
, 你明白了。
但是,幕后的数据仍然是一样的。
不用担心 Python 控制台如何显示输出字符串——处理其内容可能更重要。
【讨论】:
问题是我必须向 modbus 发送命令,它需要这样的命令:\x01\x06\x00\x06\x0a\xe9\xcc 但是python发送的是这样的:\x01\x06 \x00\x06\\n\xe9\xcc 我不认为这是真的,底层数据是原样的,没有被触及。如果数据是\x01\x06\x00\x06\x0a\xe9\xcc
,那么SENT是\x01\x06\x00\x06\x0a\xe9\xcc
,控制台上显示的是\x01\x06\x00\x06\\n\xe9\xcc
【参考方案2】:
试试这个
def print_me(thing: bytes):
print(''.join(
f'\\xbyte:02x'
for byte in thing
))
print_me(bytes.fromhex("0106000600000AE9CC"))
输出:
\x01\x06\x00\x06\x00\x00\x0a\xe9\xcc
【讨论】:
【参考方案3】:b
字符串前的符号表示您有一个字节列表。当您打印它时,python 会尽可能地对字节进行解码,以便为简单起见以符号表示它们。
字节b'\x0A'
对应十进制值10,即newline symbol in ascii。这就是您打印此符号的原因。
在后台,您的字节 b'\x0A'
并未更改。
【讨论】:
以上是关于将输入十六进制 0A 转换为 \n 转义字符的主要内容,如果未能解决你的问题,请参考以下文章