Настройка двоичного писателя C#
Есть ли способ настроить способ записи двоичных файлов в файлы, чтобы я мог читать файл из программы на C++?
Например:
myBinaryWriter.Write(myInt);
myBinaryWriter.Write(myBool);
И в C++:
fread(&myInt, 1, sizeof(int), fileHandle);
fread(&myBool, 1, sizeof(bool), fileHandle);
РЕДАКТИРОВАТЬ: Из того, что я вижу, если длина строки достаточно мала, чтобы уместиться в один байт, то это так, как она пишет, что плохо, если я хочу прочитать его обратно в C++.
2 ответа
Если вы хотите гарантировать бинарную совместимость, возможно, самый простой подход из C# состоит в том, чтобы отключить двоичную запись и просто использовать поток для записи байтов самостоятельно. Таким образом, вы получаете полный контроль над выходными данными
Другой подход заключается в создании сборки, которая может записывать данные с использованием C++ / cli, чтобы вы могли получить прямую совместимость с C++ из управляемого кода.
У вас есть несколько вариантов, которые вы можете выбрать:
- Пишем его побайтово. это, возможно, худший вариант. это требует больше работы с обеих сторон (сериализации и десериализации).
- Используйте некоторые кроссплатформенные сериализаторы, такие как Protobuf. у него есть порты практически для любой платформы, включая C# (protobuf-net) и C++. и он также прост в использовании и имеет действительно хорошую производительность.
- Вы можете использовать Struct и преобразовать его в байтовый массив с помощью Marshal.PtrToStructure (если вам нужен другой способ, вы можете использовать Marshal.StructureToPtr). В интернете много примеров. Если вы можете использовать Managed CPP, вы можете использовать один и тот же объект, чтобы вы могли изменить структуру в одном месте, и она изменится в обоих местах.
- если вы используете Managed CPP, вы можете использовать встроенные сериализаторы, такие как BinaryFormatter...