【问题标题】:meaning of different data byte format不同数据字节格式的含义
【发布时间】:2021-12-24 13:37:12
【问题描述】:

从 CAN DBC 文件中,我获取少量 Can Messages 并为 Can Messages 的每个信号分配值,然后对其进行编码以发送 can 消息。

对于每个信号,数据以不同的方式编码(下面列出了几个示例)

Data1--> b'\x00\x00d\x01P\x00\x00\x01'
Data2--> b'\x01\x81\x0f\x11\xc8\x00\x00\x00'
Data3--> b'\x00\x00d\x01P\x00\x00\x01'

我的疑问是.. x00d,x01P,x00d 这些数据是什么意思,它表示什么剂量(P 和 d 是什么)。

请告诉我为什么数据字节采用这种格式(例如:x00d、x01P、x00d)以及如何以正常/通常格式获取数据(例如:Data2--> b'\x01\x81\x0f\ x11\xc8\x00\x00\x00')

【问题讨论】:

    标签: python can-bus automotive


    【解决方案1】:

    您在字节串中看到的dP 值是碰巧代表ASCII 字符的字节。所以 Python 以这种方式显示它们。如果您想查看所有字节的原始十六进制值,您可以在字节串上调用 bytes.hex() 方法,它会为您提供如下输出:'0000640150000001'(其中 64 替换 d50 替换P)。

    但如果你只是传递字节对象,你可能不需要做任何事情。期望字节对象的代码将发现 b'd'b'\x64' 一样可接受,因为它们是写入相同字符的两种方式。

    【讨论】:

      【解决方案2】:

      这与 C 字符串常量完全一样。当字节是可打印的 ASCII 值时,它会显示 ASCII。如果不是,它会显示十六进制。因此,您的第一个和第三个字符串代表十六进制字节00 00 64 01 50 00 00 01。你的第二个是01 81 0f 11 c8 00 00 00

      大多数情况下,你不应该担心这个如果你不自己格式化,这就是 Python 打印字节字符串的方式。

      【讨论】:

      • 换句话说,无论使用何种工具来显示数据,都无法意识到字符可以包含原始数据而不仅仅是字符串,这太愚蠢了。例如,这是 PC 程序员编写的糟糕 C 调试器中的常见缺陷。
      • 你完全错了。考虑x = b'abcde\nfghij\n'。你想以十六进制显示吗?
      • 重点是数据是要么字符串或原始二进制值。同时将其视为两者是没有意义的。体面的工具有一个选项,您可以告诉它将数据显示为字符串或原始十六进制。 CAN 总线消息很少是每个字符,因此将它们显示为字符串的工具不是合适的工具,句号。
      • 是的,但工具有责任了解自己的上下文并进行正确的格式化。我们在这里看到的 repr 表示从未打算用于生产输出。它用于创建一个可以回读和评估的字符串,以重新创建原始值。而已。你的期望太高了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-14
      • 2010-11-12
      相关资源
      最近更新 更多