std: ostream и кроссплатформенная совместимость - PullRequest
1 голос
/ 07 декабря 2011

У меня есть простая функция сохранения / загрузки файлов, но, поскольку это плагин, благодаря API хоста все записывается в std :: ostream в двоичном формате и снова считывается из std :: istream.

я использую

out.write((char *)&value,sizeof(type));
in.read((char *)&value,sizeof(type));

для чтения и записи, где тип "unsigned int", "double" и т. Д.

Я думал о возможных последствиях этого, что произойдет, когда файл будет сохранен на одной платформе и загружен на другой (из-за ограничений хоста это будут 32/64-битные Windows, 64-битные Linux и 64-битные Mac, только x86 процессоры). если я не использую тип переменного размера, например size_t (который отличается в 32-битной и 64-битной системах), могу ли я быть уверен, что «unsigned int» или «double» останутся одинаковой длины? Есть ли лучшие практики для этого?

Ответы [ 2 ]

1 голос
/ 07 декабря 2011

если я не использую тип переменного размера, например size_t (который отличается в 32-битной и 64-битной системах), могу ли я быть уверен, что «unsigned int» или «double» останутся одинаковой длины?

Нет.Даже размер unsigned int и double может варьироваться в зависимости от платформы.


Есть ли передовой опыт для решения этой проблемы?

Да.Сериализация данных.

Например, вы можете выполнить следующие шаги:

  • Сначала записать размер переменной одним байтом!
  • Затем взять переменную, разделить еев N число байтов, где N = sizeof(value), затем запишите каждый байт один за другим - от младшего байта до старшего старшего байта или наоборот.
  • На другом компьютере просто прочитайте размерСначала прочитайте байты один за другим, объедините их, чтобы получить значение.Объединение означает выполнение в обратном порядке процесса, упомянутого в шаге 2.

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

0 голосов
/ 07 декабря 2011

Все системы, на которых вы сказали, что они будут работать, будут иметь такие же размеры, как и uint32_t. double и float также будут одинаковыми.
Наилучшим опытом по-прежнему остается то, что ответил Наваз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...