2012-10-18 58 views
4

即时通讯在MS Visual Studio 2010 Express中使用C++中的fstream库加载二进制数据文件(* .mgr扩展名 - >在我公司的应用程序中专门使用)中创建一个dll。该文件是由我公司的其他人使用Delphi开发的应用程序创建的。他说前15个字节应该是一些字符,表示文件的创建日期以及应用程序版本等其他内容:阅读使用Delphi二进制编写器编写的二进制文件的FStream

“XXXX 2012”。

与fstream的加载(在二进制模式)和写入用的fstream(串模式)另一个文件后的结果如下:

“[] XXXX 2 0 1 2”

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

其他信息: 我正在使用C++,应用程序开发人员正在使用Delphi。 我使用fstream。他正在使用BW.Write()函数。 (BW == Binary Writer?) 他使用Windows 7,而我使用Windows XP Professional。

您能否对问题做出诊断?

在此先感谢

首先编辑:我添加加载那些第一字节的C++代码。

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

从我所知道的PChar是一个空字符串组成的宽(由于德尔福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个字节。仍然在调查后,我不知道如何转换。

+2

欢迎来到Stack Overflow。友好的建议。像这样的问题可以从包含代码中获益。读取文件并写入文本流的代码会有所帮助。更重要的是,Delphi版本非常重要。有两个Delphi分裂,pre-Unicode和post-Unicode。你的同事使用哪个版本? –

回答

5

看起来很清楚,在某种程度上,数据在8位文本编码和16位编码之间被破坏。虚假的第一个字符几乎可以肯定是UTF-16 BOM。

一个可能的解释是,Delphi开发人员正在将UTF-16编码文本写入文件。据推测,你期待的是一个8位编码。

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

对Delphi程序输出的文件使用十六进制编辑器来精确缩小发生修剪的位置。

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

+1

开发人员可能已从早期版本升级到D2009 +,因此他的Ansi字符串现在是Unicode。他应该特别使用AnsiString或ShortString。 (并且保持字符串中的字节也稍微有些不妥,但这是另一回事......) –

+1

@DavidM它实际上看起来像文本而不是字节。它可能都是<128所以'AnsiString'就好了。 –

+0

他很不幸没有在这里atm,但我潜入他的电脑,并提取这一行:BW.Write(PChar('MG-XXX-XXX-2012'));什么是Pchar?我第一次猜测它是一个c字符串等价物(指向char表的指针?) – user1756573