Загрузка структуры из файла - PullRequest
0 голосов
/ 03 июля 2018

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

struct Structure
{
    uint8_t value1;
    uint16_t value2;
    uint32_t value3;
    uint64_t value;4
};

Допустим, файл всегда пишется в формате с прямым порядком байтов, поэтому приложение читает его строго. В этом случае порядок байтов не должен вызывать проблем. (Предположим, что существует какая-то функция convertEndinness (), которая достаточно умна, чтобы исключить проблему с порядком байтов). Второе, что я знаю, необходимо учитывать, это разнообразие переменных размеров. Есть мой вопрос. Могут ли типы фиксированного размера справиться с этой проблемой, и что еще я должен учитывать для создания многоплатформенного двоичного файла?

1 Ответ

0 голосов
/ 03 июля 2018

Решают ли типы фиксированного размера эту проблему

Не совсем.

Типы фиксированного размера имеют фиксированные размеры, но их требования выравнивания (и, следовательно, отступы) могут различаться в зависимости от платформы и / или разновидностей ABI. Таким образом, ваша структура может по-прежнему иметь разную компоновку на разных платформах даже с одним и тем же порядком байтов.

Вы можете настаивать на том, что не должно быть заполнения, и использовать какой-то специфичный для компилятора и нестандартный способ указать это (например, #pragma pack или __attribute__((packed))). Это может привести к худшему коду для прямого доступа к выровненным элементам.

Что еще я должен рассмотреть, чтобы создать мультиплатформенный двоичный файл?

Если вы выбираете порядок байтов, используете типы фиксированного размера и правильно указываете выравнивание, вы, вероятно, в порядке.

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

...