FStream读取用Delphi';s二进制写入程序 我在MS VisualStudioExpress 2010中创建了一个DLL,它使用C++中的FScript库加载二进制数据文件(*.MGR扩展->专门用于我公司的应用程序)。这个文件是用一个应用程序创建的,这个应用程序是由我公司中使用Delphi的其他人开发的。他说,前15个字节应该是一些字符,表示文件的创建日期,以及一些其他内容,如应用程序的版本:

FStream读取用Delphi';s二进制写入程序 我在MS VisualStudioExpress 2010中创建了一个DLL,它使用C++中的FScript库加载二进制数据文件(*.MGR扩展->专门用于我公司的应用程序)。这个文件是用一个应用程序创建的,这个应用程序是由我公司中使用Delphi的其他人开发的。他说,前15个字节应该是一些字符,表示文件的创建日期,以及一些其他内容,如应用程序的版本:,c++,delphi,delphi-xe2,C++,Delphi,Delphi Xe2,“XXXX 2012” 使用fstream(二进制模式)加载并使用fstream(字符串模式)写入另一个文件后的结果如下: “[]X X X 2 0 1 2” 第一个字符是未知字符(矩形),然后每个字符之间都有空格。最后是31字节宽。15表示实际字符+15表示空白+1表示矩形字符=31 其他一些信息: 我使用C++,应用程序开发人员使用Delphi。 我正在使用fstream。他正在使用BW.Write()函数。(BW==二进制写入程序?) 他使用Windows 7,而我使用Windows XP

“XXXX 2012”

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

“[]X X X 2 0 1 2”

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

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

你能诊断出这个问题吗

提前谢谢

<强>第一次编辑<强>:我正在添加加载第一个字节的C++代码。

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

据我所知,PChar是一个以null结尾的字符串,由widechars(自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(); 
}
wchar_t头[15];
DXFLIBRARY_API void loadMGR(常量字符*szFileName,常量字符*szOutput)
{
流文件;
打开(szFileName,ios::binary | ios::in);
if(file.is_open())
{
read(reinterpret_cast(header),sizeof(header));
}
file.close();
//扎皮斯
fstream存储文件;
打开(szOutput,ios::out);
if(saveFile.is_open())
{
write(reinterpret_cast(header),sizeof(header));
}
saveFile.close();
}

标头包含15个wchar\t,因此我们得到30个字节。在调查之后,我仍然不知道如何转换。

很明显,数据在8位文本编码和16位编码之间的某个地方被破坏了。伪第一个字符几乎肯定是UTF-16 BOM

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

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

在Delphi程序输出的文件上使用十六进制编辑器来精确缩小发生损坏的位置


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

开发人员可能已经从早期版本升级到D2009+,因此他的字符串是Ansi,现在是Unicode。他应该特别使用AnsiString或ShortString,最有可能的是。(在字符串中保存本应为字节的内容也有点不可靠,但这是另一回事……@DavidM它实际上看起来像文本而不是字节。很不幸,他不在这里,但我潜入他的电脑提取了这行代码:BW.Write(PChar('MG-XXX-XXX-2012');什么是Pchar?我的第一个猜测是c字符串等价物(指向字符表的指针?
PChar
char*
还是
wchar\u t*
,取决于Delphi版本。2009及更高版本使用宽UTF-16作为本机编码。如果Delphi dev使用XE2,那么
PChar('MG-XXX-XXX-2012')
是UTF-16编码的。当然,C++代码读取和写入30字节而不是15字节。因此,似乎没有一个代码只处理15个8位编码字符!欢迎来到堆栈溢出。友好的忠告。这样的问题得益于包含代码。您读取文件并写入文本流的代码会有所帮助。此外,Delphi版本也很重要。有两种德尔福分类法,前Unicode和后Unicode。您的同事使用的是哪个版本?