2010-07-15 85 views
0

在Indy中,當我們向服務器發送一些字符串時,它們會更改並以新格式顯示。例如我試圖用「WriteLn」命令在印地發送的二進制文件(的file.exe):在「Indy」(德爾福)發送帶有「WriteLn」的特殊字符串

Ms.LoadFromFile(FileAddress); 

    Ms.Read(B, Chunk); 

    for j := low(B) to high(B) do 
    begin 
     Part := Part + chr(B[j]); 
    end; 

以及用於發送字符串:

FileClient.IOHandler.WriteLn(Part); 

當客戶端被髮送字符串到服務器,我正在用嗅探器監視着它。最後我得到了這樣的結果:

MZ?.........yy..,[email protected],.....o..?.I!,.LI!This program cannot be run in DOS mode....$.. 

正如你看到有一些字符,他們不是真正的格式,他們改變爲「?」性格。但應該注意的是,嗅探器會自動將某些字符串更改爲「。」。例如,其中一個點(「。」)可能是chr(0)或chr(5)!

但嗅探器無法將某些字符改爲「。」我們看到他們在「?」格式。 例如我打開一個二進制文件,用記事本,你可以看到真正的格式:

alt text http://up.iranblog.com/Files/9f195012dbc2425b8773.png 無論如何,問題是:我如何能在印第安納波利斯10發送帶有「WriteLn」命令的二進制文件?

+0

什麼版本的Delphi?如果D2009 +將字符串解釋爲Unicode,其中1個字符不等於1個字節。 – 2010-07-15 07:42:27

回答

13

@Kermia,WriteLn程序旨在發送文本數據而不是二進制文件,還在每個發送的消息的末尾添加一個CRLF。

您可以使用WriteStreamWrite過程發送二進制數據。

如果您堅持使用WriteLn程序,則需要在發送之前使用Binary-to-text encoding(如Base64)進行編碼,然後在服務器端進行解碼。

+1

同意,特別是因爲數據是從TStream開始的。 Indy也有一個WriteFile()方法,它可以打開一個文件並將其字節原樣轉儲到套接字中。 – 2010-07-15 20:50:21