You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 15:36:22