FStream读取用Delphi的二进制写入器编写的二进制文件

时间:2012-10-18 14:27:53

标签: c++ delphi delphi-xe2

我在MS Visual Studio 2010 Express中创建一个dll,它使用C ++中的fstream库加载二进制数据文件(* .mgr扩展名 - >专门用于我公司的应用程序)。该文件是使用我公司中正在使用Delphi的其他人开发的应用程序创建的。他说,前15个字节应该是一些字符,表示文件的创建日期和其他一些东西,如应用程序的版本:

“XXXX 2012”。

使用fstream加载(二进制模式)并使用fstream(字符串模式)写入另一个文件后的结果如下:

“[] X X X X 2 0 1 2”

第一个字符是未知的字符(矩形),然后每个字符之间有空格。最后是31字节宽。 15表示实际字符+ 15表示空格+ 1表示rect char = 31。

其他一些信息: 我正在使用C ++,app开发人员正在使用Delphi。 我正在使用fstream。他正在使用BW.Write()函数。 (BW ==二进制作家?) 他在使用Windows XP Professional时使用Windows 7。

你能诊断出这个问题吗?

提前致谢

首次编辑:我正在添加加载第一个字节的c ++代码。

首先他使用embarcadero Rad Studio XE2的Delphi XE2。

据我所知,PChar是一个以null结尾的字符串,由宽字符组成(自delphi 2009以来),宽度为2字节,而不是普通字符(一个字节)。所以基本上他是保存单词而不是字节。

这是加载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个字节。在调查后我仍然不知道如何转换。

1 个答案:

答案 0 :(得分:5)

似乎很清楚,在8位文本编码和16位编码之间数据被破坏的某个地方。虚假的第一个角色几乎可以肯定是UTF-16 BOM。

一种可能的解释是Delphi开发人员正在将UTF-16编码文本写入该文件。大概你期待8位编码。

另一个解释是Delphi代码正确地写出了8位文本,但是你的代码正在破坏它。也许您的读/写代码正在这样做。

在Delphi程序的文件输出上使用十六进制编辑器来精确缩小修改的位置。

在问题中没有任何代码的情况下,很难比这更具体。