【问题标题】: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在显示字节串的表示时只是将其显示为转义字符。

标签: python serial-port hex escaping html-escape-characters


【解决方案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'\\x{byte: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' 并未更改。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-31
      • 1970-01-01
      • 2018-01-22
      • 2015-01-06
      • 2013-02-07
      • 2013-10-09
      • 2023-04-03
      相关资源
      最近更新 更多