FStream читает бинарный файл, написанный с помощью бинарного писателя Delphi

Я создаю DLL в MS Visual Studio 2010 Express, которая загружает двоичный файл данных (расширение * .mgr -> используется исключительно в приложениях моей компании) с использованием библиотеки fstream на C ++. Файл создается с помощью приложения, разработанного кем-то из моей компании, использующего Delphi. Он говорит, что первые 15 байтов должны быть некоторыми символами, которые указывают дату, когда был создан файл, и некоторыми другими вещами, такими как версия приложения:

«XXXX 2012».

Результат после загрузки с помощью fstream (в двоичном режиме) и записи другого файла с помощью fstream (строковый режим) выглядит следующим образом:

«[] X X X X 2 0 1 2»

Первый символ — это неизвестный символ (прямоугольник), тогда между каждым символом есть пробелы. Наконец, это 31 байт в ширину. 15 для действительных символов + 15 для пробелов + 1 для прямоугольного символа = 31.

Некоторая другая информация:
Я использую C ++, разработчик приложений использует Delphi.
Я использую fstream. он использует функцию BW.Write (). (BW == Двоичный писатель?)
Он использует Windows 7, а я использую Windows XP Professional.

Можете ли вы поставить диагноз проблемы?

заранее спасибо

Первое редактированиеЯ добавляю код C ++, который загружает эти первые байты.

Во-первых, он использует Delphi XE2 из Embarcadero Rad Studio XE2.

Из того, что я знаю, PChar — это строка с нулевым символом в конце, состоящая из широких символов (начиная с delphi 2009), ширина которых составляет 2 байта, в отличие от обычных символов (один байт). Так что в основном он сохраняет слова вместо байтов.

вот код загрузки мгр:

wchar_t header[15];
DXFLIBRARY_API void loadMGR(const char* szFileName, const char* szOutput)
{
fstream file;
file.open( szFileName, ios::binary | ios::in );
if(file.is_open())
{
file.read(reinterpret_cast<char*>(header),sizeof(header));
}
file.close();

//zapis

fstream saveFile;
saveFile.open( szOutput, ios::out );
if(saveFile.is_open())
{
saveFile.write(reinterpret_cast<const char*>(header),sizeof(header));
}
saveFile.close();
}

Заголовок содержит 15 wchar_t, поэтому мы получаем 30 байтов. Тем не менее, после расследования я понятия не имею, как конвертировать.

4

Решение

Кажется довольно ясным, что где-то по пути данные переносятся между 8-битной кодировкой текста и 16-битной кодировкой. Ложный первый персонаж — почти наверняка БОМ UTF-16.

Одним из возможных объяснений является то, что разработчик Delphi записывает в файл текст кодировки UTF-16. И, вероятно, вы ожидаете 8-битную кодировку.

Другое объяснение состоит в том, что код Delphi правильно записывает 8-битный текст, но ваш код его искажает. Возможно, ваш код для чтения / записи делает это.

Используйте шестнадцатеричный редактор для вывода файла из программы Delphi, чтобы точно определить, где происходит искажение.

В отсутствие какого-либо кода в вопросе трудно быть более конкретным, чем этот.

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]