为什么从 Socket 读取时 CAN BUS 帧 ID 是反向的?

use*_*227 4 c++ sockets can-bus

我有一个 Raspberry Pi 从车辆读取 CAN 数据。如果我使用candump其中包含的程序,canutils我会得到一堆数据,示例如下:

can0 1C4 [8]  03 F3 26 08 00 00 7F 70
Run Code Online (Sandbox Code Playgroud)

然后,我编写了一个简单的 C++ 应用程序来打开总线的套接字can0并将一些数据读入字符缓冲区。如果我在读取后循环遍历缓冲区的每个字符并将每个字符转换为十六进制格式的 int (并在每个字符之间放置一个管道),我会得到以下结果:

c4|1|0|0|8|0|0|0|3|f3|26|8|0|0|7f|70|
Run Code Online (Sandbox Code Playgroud)

我的问题是,为什么当我使用套接字和字符缓冲区读取数据时,ID 字节会反转?此行为与所有 CAN ID 一致。数据长度代码和数据的格式/顺序正确,但 ID 向后。

谢谢,亚当

YSC*_*YSC 7

恭喜,您刚刚发现了字节序

字节顺序是指当存储在计算机内存或辅助存储器中或通过数字链路传输时,字节被排列成较大数值的顺序。字节序在计算机科学中很有趣,因为两种相互冲突且不兼容的格式经常使用:单词可以用大端格式或小端格式表示,具体取决于位或字节或其他组件是否从大端(最重要的字节)开始排序。位)或小端(最低有效位)。

按照惯例,网络(包括总线)数据是大端字节序。您的 PC 架构可能是小端字节序。

为了解决此问题,请将数据传递给ntoh*()函数以将其字节顺序(如有必要)从网络 ( n) 字节顺序反转为主机 ( h) 字节顺序。