为了账号安全,请及时绑定邮箱和手机立即绑定

如何从此数据类型中提取十六进制值?

如何从此数据类型中提取十六进制值?

慕尼黑的夜晚无繁华 2023-03-30 09:53:05
我正在使用 Pythoncantools库从 CAN dbc 文件中提取消息,返回的数据类型如下所示:message('Message_10', 0x146, False, 8, None),我需要提取第二个值,0x146并且消息名称的长度可能会发生变化,因此标准字符串切片将无法始终如一地工作。我的第一个想法是转换message('Message_10', 0x146, False, 8, None),成一个字符串,然后删除所有不以开头的内容0x,但我怀疑有更好的方法。这样做的目的是从 DBC 文件中提取所有 CAN ID,并创建一个字典,每个罐 ID 号作为键。然后监控 CAN 总线并使用与 CAN 总线上每个 CAN ID 关联的数据有效负载更新目录中的每个值。这是我的代码片段,我最初尝试只提取消息名称,这很有效,但我需要消息 ID,0x146作为我字典中的键,以便在我查看总线上的传入时进行比较任何人都知道如何做到这一点?import cantools db = cantools.database.load_file('C:\\Users\\Tim\\Desktop\\dbc_file.dbc')def can_table(db):    messages = []    #pprint.pprint(db.messages)    for msg in range(0, len(db.messages)):        x = str(db.messages[msg])        x = x[7:]  # Remove "message"        x = x.replace('(', '').replace(')', '').replace('\'', '')        x = x.split(', ') # Split into list        messages.append(x[0])  # First element is list is the message name    message_table = {}    # Populate values as None in dictionary     for i in messages:        message_table[i]=None    #pprint.pprint(message_table)    return message_tablex之后可以str()调用的示例:"message('Message_3', 0x143, False, 8, None)""message('Message_2', 0x142, False, 8, None)""message('Message', 0x141, False, 8, None)""message('Message_with_long_name', 0x201, False, 8, 'comment that explains what this message does')"
查看完整描述

1 回答

?
料青山看我应如是

TA贡献1772条经验 获得超8个赞

第二个值是 frame_id。只是做msg.frame_id。不要将其转换为字符串。

for msg in db.messages: 
   print(msg.frame_id)

从 cantools 代码中,您可以看到使用该方法将消息转换为字符串__repr__

cantools.Message.__repr__

def __repr__(self):    return "message('{}', 0x{:x}, {}, {}, {})".format(
        self._name,
        self._frame_id,
        self._is_extended_frame,
        self._length, 
               "'" + self._comment + "'" if self._comment is not None else None)


查看完整回答
反对 回复 2023-03-30
  • 1 回答
  • 0 关注
  • 97 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信