Big Endian Vs Little Endian Padding Issue - PullRequest
1 голос
/ 09 ноября 2011

В моем коде есть структура, которая имеет проблемы с заполнением. Я исправил их, и мой код работает на машине с прямым порядком байтов. Может ли быть шанс, что эта структура вызовет проблему для машины с прямым порядком байтов ??

Ответы [ 2 ]

1 голос
/ 09 ноября 2011

Вам необходимо помнить следующее:

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

(Это может привести к довольно непонятным протоколам, таким как промышленная стандартная полевая шина CANopen, в которой все целые числа в отправляемых данных должны быть с прямым порядком байтов, но идентификатор и контрольная сумма должны быть с прямым порядком байтов.)

  • Заполнение структуры всегда вызывает проблемы при написании переносимого кода. Код типа send(&my_struct, sizeof(my_struct) никогда не переносится! Потому что он будет отправлять данные и любые байты заполнения. И байты заполнения могут быть где угодно внутри структуры, а не только в конце. Если вам нужно написать действительно переносимый код, вы не можете использовать структуры / объединения для протокола данных, все должно храниться в массивах байтов или аналогичных, где данные гарантированно размещаются в соседних ячейках. Заполнение структуры не имеет ничего общего с порядком байтов, а скорее с набором команд ЦП.

(ЦП Motorola традиционно имели лучшую поддержку для чтения и хранения по невыровненным адресам, в то время как производные Intel предъявляют требования к выравниванию и, следовательно, более склонны к использованию отступов. Как оказалось, Motorola была с большим порядком байтов, а Intel с небольшим Таким образом, по совпадению, процессоры с прямым порядком байтов с большей вероятностью имеют заполнение, но это только из-за набора инструкций ЦП, а не из-за самого порядка байтов.)

0 голосов
/ 09 ноября 2011

Структура в C - это способ представления данных в памяти.(Это дает «структуру» в память.)

Любое преобразование из «структуры» в «последовательность байтов», которая просто отбрасывает бит «структуры» и использует то, что использует лежащее в основе представление C, которое собираетсябыть затронутым порядком байтов(И дополнения. Возможно, есть и другие проблемы, такие как указатели, sizeof (некоторый целочисленный тип) и т. Д.)

Я подозреваю, что вы делаете что-то вроде этого:

// Some non-standard way to get rid of padding in Foo
struct Foo
{
  // Some fields...
}

// Meanwhile, in a function somewhere...
fwrite(a_foo, sizeof(a_foo), 1, fp);

Может бытьВы не звоните fwrite, возможно, это send, но да, если вы делаете сериализацию, как это, вы будете подвержены влиянию порядка байтов.

...