将输入十六进制 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 转义字符的主要内容,如果未能解决你的问题,请参考以下文章

将十六进制字符串转换为二进制文件使其损坏且无法打开

如何在 C 中将字节数组转换为十六进制字符串?

在 Ruby 中将整数转换为十六进制字符串

将十六进制字符串转换为 IP 地址

C语言:输入一个十六进制字符串,将其转换成为对应的整数并输出转换结果。

Java十六进制转换为十进制