【问题标题】: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 及更高版本中则不行。

    您可以:

    1. 继续使用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);
      
    2. 改用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;
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-07
      • 2018-09-22
      • 2017-12-26
      • 2021-06-30
      • 1970-01-01
      • 2023-03-04
      • 1970-01-01
      相关资源
      最近更新 更多