如何在Python中去除CAN报文里的ASCII格式化字符?
强制bytearray以纯十六进制转义形式打印
Python默认打印bytearray时,会把可打印的ASCII字符(如^]、b这类)显示为对应符号,而非十六进制转义序列。要实现所有字节都以\xXX格式输出,你可以自定义格式化函数来处理:
方法:自定义格式化函数
写一个函数遍历bytearray的每个字节,将其转为\xXX格式的字符串,再拼接成类似b'\x00\x00\x01\x65...'的形式:
def format_pure_hex(ba): # 遍历每个字节,转为两位十六进制转义符,可切换02x(小写)/02X(大写) hex_escapes = [f'\\x{byte:02X}' for byte in ba] # 拼接成目标格式的字符串 return f"b'{''.join(hex_escapes)}'"
修改你的代码
把原打印语句替换为调用这个函数:
#receiving CAN Bus messages here import can bus = can.interface.Bus(interface='kvaser', channel=0, bitrate=1000000) byte_index_to_check = 1 msg = can.Message(arbitration_id=0x007) bus.send(msg) recvMsg = bus.recv(timeout=0.5) message = bus.recv() received_message = hex(message.data[byte_index_to_check]) last_message = message last_received = received_message # 使用自定义函数打印纯十六进制格式 print("last message", format_pure_hex(last_message.data))
运行后输出会变成类似b'\x00\x00\x5E\x5D\x62\x09\x62\xD9'的纯十六进制形式,不会再显示ASCII字符。
另一种简洁方法(用binascii)
如果不想写循环,也可以用binascii.hexlify快速转换:
import binascii def format_pure_hex(ba): hex_str = binascii.hexlify(ba).decode('utf-8') hex_pairs = [hex_str[i:i+2] for i in range(0, len(hex_str), 2)] return f"b'{''.join([f'\\x{p}' for p in hex_pairs])}'"
效果和上面的函数完全一致,任选一种即可。
内容的提问来源于stack exchange,提问作者oznurc
相关产品推荐
相关产品推荐

