为什么从套接字读取时 CAN 总线帧 ID 向后?
Why is the CAN BUS Frame ID backwards when reading from a Socket?
所以我有一个Raspberry Pi从车辆读取CAN数据。 如果我使用canutils
中包含的candump
程序,我会得到一堆数据,示例如下所示:
can0 1C4 [8] 03 F3 26 08 00 00 7F 70
然后,我编写了一个简单的C++应用程序来打开can0
总线的套接字,并将一些数据读取到字符缓冲区中。 如果我在读取后遍历缓冲区的每个字符并将每个字符转换为十六进制格式的 int(并在每个字符之间放置一个管道),我会得到以下内容:
c4|1|0|0|8|0|0|0|3|f3|26|8|0|0|7f|70|
我的问题是,为什么当我使用套接字和字符缓冲区读取数据时,ID 字节会反转? 此行为与所有 CAN ID 一致。数据长度代码和数据采用正确的格式/顺序,但 ID 向后。
谢谢 亚当
恭喜,你刚刚发现了字节序。
字节序是指字节排列成较大数值的顺序,当存储在计算机内存或辅助存储器中时,或通过数字链路传输时。字节序在计算机科学中很有意义,因为通常使用两种相互冲突且不兼容的格式:单词可以用大端或小端格式表示,具体取决于位或字节或其他组件是从大端(最高有效位)还是小端(最低有效位)排序的。
按照惯例,网络(包括总线)数据是大端序。您的 PC 架构可能是小端序。
为了解决这个问题,将您的数据传递给ntoh*()
函数,以反转其字节顺序(如有必要)从网络(n
)到主机(h
)字节序。
相关文章:
- 码头化的C++应用程序是否向后兼容早期的内核版本
- 提升序列化 1:73 的向后兼容性问题
- 各种版本的 Mac OSX 向后兼容性如何?(Xcode C++
- 我写的 ASCII 到二进制转换器C++向后显示二进制,如何使其正确显示?
- 向后迭代 std::array 或 std::vector 的正确方法是什么?
- 如何解决我们必须向前和向后迭代的项链断裂问题
- 无法打印完整的二叉搜索树,因为我从最低节点向后迭代的逻辑有缺陷
- 右值需要分配什么向后兼容性
- 提升 ASIO TCP 套接字 1.70 不向后兼容
- 向后打印二进制数
- C++向后正则表达式搜索
- 如果 constexpr 使用尽可能短的代码,我该如何向后移植?
- 使用迭代从链表向后打印字符串
- 如何使我的链表在C++中向后打印
- 如果您向前移动,如何更改屏幕,如果向后移动,如何看到较旧的东西?
- 为什么 C++17 个 destroy()/destroy_n() 函数向前(而不是向后)运行?
- 为什么递归向后工作?
- 值为 std::string,同时保持向后兼容性
- 与Boyer-Moore-Horspool一起向后搜索
- 为什么从套接字读取时 CAN 总线帧 ID 向后?