4

MS Visual Studio 2010 Expressでdllを作成し、C ++のfstreamライブラリを使用してバイナリデータファイル(* .mgr拡張子->私の会社のアプリケーションでのみ使用)をロードします。このファイルは、Delphiを使用している私の会社の他の誰かによって開発されたアプリで作成されています。彼は、最初の15バイトは、ファイルが作成された日付を示すいくつかの文字と、アプリのバージョンのような他のいくつかのものでなければならないと言います。

「XXXX2012」。

fstream(バイナリモード)でロードし、fstream(文字列モード)で別のファイルを書き込んだ後の結果は次のとおりです。

"[] XXXX 2 0 1 2"

最初の文字は不明な文字(長方形)であり、各文字の間にスペースがあります。最後に、31バイト幅です。実際の文字の場合は15+空白の場合は15+rect文字の場合は1=31。

その他の情報:私はC ++を使用しており、アプリ開発者はDelphiを使用しています。私はfstreamを使用しています。彼はBW.Write()関数を使用しています。(BW == Binary Writer?)彼はWindows 7を使用していますが、私はWindowsXPProfessionalを使用しています。

問題の診断を下すことができますか?

前もって感謝します

最初の編集:これらの最初のバイトをロードするC++コードを追加しています。

まず、彼はエンバカデロRadStudioXE2のDelphiXE2を使用しています。

私が知っていることから、PCharは、通常の文字(1バイト)とは対照的に2バイト幅のワイド文字(delphi 2009以降)で構成されるnullで終了する文字列です。つまり、基本的に彼はバイトではなく単語を保存しています。

mgrをロードするコードは次のとおりです。

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

1 に答える 1

5

データが8ビットのテキストエンコーディングと16ビットのエンコーディングの間で混乱していることはかなり明らかなようです。偽の最初の文字は、ほぼ確実にUTF-16BOMです。

考えられる理由の1つは、Delphi開発者がUTF-16エンコーディングテキストをファイルに書き込んでいることです。そしておそらくあなたは8ビットのエンコーディングを期待しています。

もう1つの説明は、Delphiコードが8ビットのテキストを正しく書き込んでいるが、コードがそれをマングリングしているということです。おそらく、読み取り/書き込みコードがそれを行っています。

Delphiプログラムから出力されたファイルで16進エディタを使用して、マングリングが発生する場所を正確に絞り込みます。

質問にコードがない場合、これより具体的にするのは難しいです。

于 2012-10-18T14:29:22.680 に答える