1

我正在使用 Delphi 6 和 Indy 8 通过 UDP 从电子板上发送和接收消息。但是自从更新到 Delphi XE4 后,TIdUDPClient组件发送了错误的数据包。我认为问题在于该Send()函数仅以 Unicode 发送。可以寄过去AnsiStringTIdUDPClient.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);
4

1 回答 1

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;
    
于 2013-07-26T20:28:48.177 回答