Присвоение значения порядку байтов структуры

Итак, у меня есть структура:

typedef struct sendPacketStruct {
  byte header = headerByte;//0x55
  unsigned int time;//2 байта
  int height;//2 байта
};

И я делаю это:

    sendPacketStruct sendPacket;

    sendPacket.time = 84;//0x54
    sendPacket.height = 100;//0x65
    
    Serial.write((byte*)&sendPacket, sizeof(sendPacket));

Но когда я получаю его на другом конце, шестнадцатеричные байты:

55 54 00 64 00

Таким образом, первый байт соответствует заголовку 0x55, но значения времени и высоты 2x2 байта присутствуют, но сдвинуты.

например, это должно быть 00 54, а не 54 00

, 👍0

Обсуждение

должно быть 00 54, а не 54 00... почему? ... вызывает ли это проблему? ... байты не сдвигаются, @jsotola

Потому что, если я прочитаю 2-й и 3-й байты, чтобы получить int, я получу 0x5400, что равно 21504, а не 84 (0x54)., @Hayden Thring

см. "endiannes" в википедии. Вот почему лучше отправлять текст между системами., @Juraj

прочитайте 2-й и 3-й байты, чтобы получить целое число ... как вы делаете целое число? ... вы читаете байты отдельно?, @jsotola

Я бы считывал последовательные данные по байтам за раз, когда они поступали в буферный массив. Когда я обнаруживаю полный пакет в буфере, я преобразовываю различные биты в данные. Это в мобильном приложении., @Hayden Thring

Итак, на самом деле это работает правильно для системы с прямым порядком байтов, о которой я не знал, я просто имею опыт работы только с сетевыми протоколами с прямым порядком байтов. Спасибо @Juraj, @Hayden Thring

Либо согласуйте порядок байтов (для передачи) между всеми системами, совместно использующими эти данные, либо включите в пакет индикатор порядка байтов, и все получатели соглашаются принять любой из них., @JRobert

Обратите внимание, что сегодня большинство процессоров, включая AVR, ARM и x86-64, имеют обратный порядок байтов., @Edgar Bonet


1 ответ


Лучший ответ:

0

Ответ заключается в том, что Arduino использует обратный порядок байтов, поэтому порядок байтов правильный. Я просто ожидал порядка с прямым порядком байтов, как я видел в некоторых других сетевых протоколах. Если это желательно вместо этого, я могу просто немного сдвинуть биты и переставить.

,

Порядок байтов протокола определяется протоколом. В C есть функции htons() ntohs() и т. д. для «Host to Network Short» и т. д., которые устанавливают правильный порядок следования байтов для протокола., @Majenko