Python中input输入转义十六进制字符结果不符问题求解
问题原因
你在代码中直接书写的\x开头序列属于Python字符串字面量的转义规则,会被Python解释器在代码解析阶段直接转换为对应ASCII码的单个字符,因此'\x69\x6A\x6B'本质就是i、j、k三个字符,长度为3。
而input()函数获取的是用户输入的原始文本,不会自动解析转义序列:你输入的\x69会被识别为\、x、6、9四个独立字符,三组共12个字符,编码后反斜杠会被二次转义,就得到了b'\\x69\\x6A\\x6B'的结果。
解决方法
方法1:使用unicode_escape解析转义(兼容带普通字符的输入)
如果你的输入除了\x转义序列外还包含普通可打印字符,可以用该方法直接按照Python字符串转义规则解析输入:
raw_input = input('?') # 先将原始输入按latin1编码转为字节串,再用unicode_escape解码完成转义解析 parsed_str = raw_input.encode('latin1').decode('unicode_escape') # 编码后即可得到你需要的字节序列 target_bytes = parsed_str.encode() print(target_bytes) # 输入\x69\x6A\x6B时输出b'ijk'
方法2:直接提取十六进制值转字节(更适合串口通信场景)
如果你输入的内容全部是\x开头的十六进制转义,用该方法更稳妥,不会意外解析\n、\t等其他转义序列:
raw_input = input('?') # 去除所有\x前缀得到连续十六进制字符串 hex_content = raw_input.replace('\\x', '') # 直接将十六进制字符串转为对应字节 target_bytes = bytes.fromhex(hex_content) print(target_bytes) # 输入\x69\x6A\x6B时输出b'ijk'
拿到target_bytes后直接通过pyserial的write方法发送即可。
内容的提问来源于stack exchange,提问作者idlemarvel
相关产品推荐
相关产品推荐

