【问题标题】:Sending special strings with "WriteLn" in "Indy" (Delphi)在“Indy”(Delphi)中使用“WriteLn”发送特殊字符串
【发布时间】:2010-07-15 07:19:18
【问题描述】:

在 Indy 中,当我们向服务器发送一些字符串时,它们会发生变化并以新的格式显示。例如,我尝试在 indy 中使用“WriteLn”命令发送二进制文件(File.exe):

    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..,.......@...................................,.....o..?.I!,.LI!This    program cannot be run in DOS mode....$..

如您所见,有些字符不再是真正的格式,而是更改为“?”特点 。但需要注意的是,嗅探器会自动将某些字符串更改为“.”。 ,例如其中一个点(“.”)是 chr(0) 或 chr(5) 可能!!

但嗅探器无法将某些字符更改为“。”我们在“?”中看到它们格式 。 例如我用记事本打开一个二进制文件,你可以看到真正的格式:

alt text http://up.iranblog.com/Files/9f195012dbc2425b8773.png 无论如何,问题是:如何在 Indy 10 中使用“WriteLn”命令发送二进制文件?

【问题讨论】:

  • 什么版本的Delphi?如果 D2009+,您正在将字符串解释为 Unicode,其中 1 个字符 not 等于 1 个字节。

标签: delphi string indy


【解决方案1】:

@Kermia,WriteLn 过程旨在发送非二进制文本数据,还在每个发送的消息末尾添加一个 CRLF。

您可以使用WriteStreamWrite 过程来发送二进制数据。

如果您坚持使用WriteLn 过程,则需要在发送之前使用Binary-to-text encoding 对二进制数据进行编码,如Base64,并在服务器端解码后。

【讨论】:

  • 同意,特别是因为数据一开始就来自 TStream。 Indy 也有一个可用的 WriteFile() 方法,它打开一个文件并将其字节原样转储到套接字中。
猜你喜欢
  • 1970-01-01
  • 2018-11-08
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 2021-08-18
  • 2022-01-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多