Если вы хотите, чтобы ваш код переносился на машины с различным порядком байтов, вам нужно придерживаться одного порядка байтов в ваших файлах. Всякий раз, когда вы читаете или записываете файлы, вы делаете преобразования между порядком байтов хоста и порядком байтов файла. Обычно вы используете то, что вы называете сетевым порядком байтов, когда вы хотите записать файлы, переносимые на все машины. Порядок байтов в сети определен с прямым порядком байтов, и есть готовые функции, предназначенные для этих преобразований (хотя их очень легко написать самостоятельно).
Например, перед записью long в файл вы должны преобразовать его в сетевой порядок байтов с помощью htonl (), а при чтении из файла вы должны преобразовать его обратно в байтовый порядок хоста с помощью ntohl (). В системе с прямым порядком байтов htonl () и ntohl () просто возвращают то же число, что было передано в функцию, но в системе с прямым порядком байтов он меняет каждый байт в переменной.
Если вы не заботитесь о поддержке систем с прямым порядком байтов, ни одна из этих проблем не является проблемой, хотя это все еще хорошая практика.
Еще одна важная вещь, на которую следует обратить внимание - это заполнение ваших структур / классов, которые вы пишете, если вы записываете их непосредственно в файл (например, Header и Row). Разные компиляторы на разных платформах могут использовать разные отступы, что означает, что переменные выровнены по-разному в памяти. Это может сильно испортить ситуацию, если компиляторы, которые вы используете на разных платформах, используют разные отступы. Поэтому для структур, которые вы намереваетесь записывать непосредственно в файлы / другие потоки, вы всегда должны указывать заполнение. Вы должны указать компилятору упаковать ваши структуры следующим образом:
#pragma pack(push, 1)
struct Header {
// This struct uses 1-byte padding
...
};
#pragma pack(pop)
Помните, что это сделает использование структуры более неэффективным, когда вы используете ее в своем приложении, потому что доступ к невыровненным адресам памяти означает больше работы для системы. Вот почему, как правило, неплохо иметь отдельные типы для упакованных структур, которые вы записываете в потоки, и тип, который вы фактически используете в приложении (вы просто копируете элементы из одного в другой).
EDIT. Конечно, еще один способ решить эту проблему - это самостоятельно сериализовать эти структуры, для которых не требуется использование #pragma (прагмы зависят от компилятора, хотя все основные компиляторы, насколько мне известно, поддерживают пакет прагмы).