Почему идентификатор кадра CAN BUS перевернут при чтении из сокета?

Итак, у меня есть Raspberry Pi, считывающий данные CAN с автомобиля. Если я использую candump программу, включенную в canutils, я получаю кучу данных, пример выглядит так:

can0 1C4 [8]  03 F3 26 08 00 00 7F 70

Затем я написал простое приложение на C ++, чтобы открыть сокет для шины can0 и прочитать некоторые данные в буфер символов. Если я перебираю каждый символ буфера после чтения и конвертирую каждый char в int в шестнадцатеричном формате (и помещаю канал между каждым символом), я получаю следующее:

c4|1|0|0|8|0|0|0|3|f3|26|8|0|0|7f|70|

У меня вопрос: почему байт идентификатора меняет местами, когда я читаю данные с помощью сокета и буфера символов? Такое поведение согласуется со всеми идентификаторами CAN. Код длины данных и данные имеют правильный формат / порядок, но идентификатор указан в обратном порядке.

Спасибо Адам


person user3832227    schedule 25.09.2017    source источник


Ответы (1)


Поздравляем, вы только что открыли для себя порядок байтов.

Порядок байтов относится к последовательному порядку, в котором байты упорядочиваются в более крупные числовые значения при хранении в памяти компьютера или вторичной памяти или при передаче по цифровым каналам. Порядок байтов представляет интерес в информатике, потому что обычно используются два конфликтующих и несовместимых формата: слова могут быть представлены в формате с прямым порядком байтов или прямым порядком байтов, в зависимости от того, какие биты, байты или другие компоненты упорядочены с большого конца (наиболее значимый бит) или младший конец (младший значащий бит).

По соглашению сетевые (включая шину) данные имеют прямой порядок байтов. Архитектура вашего ПК, вероятно, имеет обратный порядок байтов.

Чтобы исправить это, передайте свои данные функциям ntoh*(), чтобы изменить их порядок байтов ( при необходимости) от сети (n) к хосту (h) по порядку байтов.

person YSC    schedule 25.09.2017
comment
Сладкого Рождества, это было просто. Я не понимал, что обратный порядок байтов приведет к тому, что данные будут выглядеть так, когда остальные данные будут в правильном порядке. Но теперь я это понимаю. Спасибо. - person user3832227; 25.09.2017
comment
@ user3832227 У всех программистов рано или поздно случается прозрение относительно порядка байтов;) - person YSC; 25.09.2017