Если вы используете mmap, вы, вероятно, обеспокоены скоростью и эффективностью. У вас есть несколько вариантов.
- Оберните все ваши чтения и записи с помощью функций htonl, htons, ntohl, ntohs. Вызов порядка htonl (хост-сеть) в Windows преобразует данные с прямым порядком байтов в старший. На других архитектурах это будет просто. Эти преобразования имеют накладные расходы, но в зависимости от ваших операций они могут быть или не быть значительными. AFAIK, это подход, используемый SQLite
- Другой вариант - всегда записывать данные в формате хоста и предоставлять процедуры, если пользователям нужно переносить свои данные между платформами. Базы данных обычно считывают и записывают данные в формате хоста, но предоставляют такие инструменты, как bcp, которые будут записывать в ASCII или сетевой порядок байтов.
- Вы можете пометить заголовок вашего файла меткой порядка байтов. Когда ваша программа запускается, она сравнивает порядок байтов с порядком в файле и, при необходимости, предоставляет любой перевод. Это часто хорошо для простых форматов данных, таких как UTF-16, но не для форматов, где у вас есть несколько типов переменной длины.
Кроме того, если вы делаете такие вещи, как предоставление префиксов длины или смещение файлов, у вас может быть сочетание 32-битных и 64-битных указателей. 32-разрядная платформа не может создать представление mmap размером более 4 ГБ, поэтому маловероятно, что вы будете поддерживать файлы размером более 4 ГБ. Такие программы, как rrdtool, используют этот подход и поддерживают гораздо большие размеры файлов на 64-битных платформах. Это означает, что ваш двоичный файл не будет совместим на разных платформах, если вы используете размер указателя платформы внутри вашего файла.
Моя рекомендация заключается в том, чтобы заранее игнорировать все проблемы с порядком байтов и спроектировать систему для быстрой работы на вашей платформе. Если / когда вам нужно переместить ваши данные на другую платформу, тогда выберите самый простой / быстрый / наиболее подходящий способ сделать это. Если вы начнете с попытки создания независимого от платформы формата данных, вы, как правило, будете делать ошибки, и вам придется вернуться и исправить их позже. Это особенно проблематично, когда 99% данных находятся в правильном порядке байтов, а 1% - неверно. Это означает, что исправление ошибок в вашем коде перевода данных приведет к поломке существующих клиентов на всех платформах.
Перед написанием кода для поддержки более чем одной платформы вам нужно будет установить многоплатформенный тест.