2012-10-18 84 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