TIdUDPClient广播错误的数据

时间:2013-07-26 05:21:56

标签: delphi indy delphi-xe4

我使用Delphi 6和Indy 8通过UDP发送和接收来自电子板的消息。但是由于更新到Delphi XE4,TIdUDPClient组件发送错误的数据包。我认为问题是Send()函数只发送Unicode。是否可以通过AnsiString发送TIdUDPClient.Send()

以下是我正在使用的代码:

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);

1 个答案:

答案 0 :(得分: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;