【问题标题】:TIdUDPClient broadcasts wrong dataTIdUDPClient 广播错误数据
【发布时间】:2013-07-26 05:21:55
【问题描述】:
我正在使用 Delphi 6 和 Indy 8 通过 UDP 从电子板上发送和接收消息。但是自从更新到 Delphi XE4 后,TIdUDPClient 组件发送了错误的数据包。我认为问题在于 Send() 函数仅以 Unicode 发送。是否可以通过TIdUDPClient.Send() 发送AnsiString?
这是我正在使用的代码:
idudpclient1.Send(#$7e#$b8#$c7#$81#$10#$8d#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$9d#$02#$0d);
【问题讨论】:
标签:
delphi
indy
delphi-xe4
【解决方案1】:
您将二进制数据作为String 发送。在 XE4 中,字符串是 Unicode,而 Indy 的默认编码是 ASCII。您的 String 数据包含超出 ASCII 范围的字符。
不要将String 用于二进制数据。这不是它的本意。您可以在更早的 Delphi 2007 中解决此问题,但在 Delphi 2009 及更高版本中则不行。
您可以:
-
继续使用Send(),但告诉它使用 Indy 的 8 位编码而不是 Indy 的默认编码:
IdUDPClient1.Send(#$7e#$b8#$c7#$81#$10#$8d#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$9d#$02#$0d, Indy8BitEncoding);
-
改用SendBuffer()(您应该这样做,即使在您的 Indy 8 代码中):
var
Buf: TIdBytes;
begin
SetLength(Buf, 34);
FillBytes(Buf, 34, $00);
Buf[0] := $7e;
Buf[1] := $b8;
Buf[2] := $c7;
Buf[3] := $81;
Buf[4] := $10;
Buf[5] := $8d;
Buf[31] := $9d;
Buf[32] := $02;
Buf[33] := $0d;
IdUDPClient1.Send(Buf);
end;