2013-07-26 35 views
0

我使用Delphi 6(Indy 8.)通过UDP发送来自电子板的接收消息。但是,因为我尝试使用delphi XE4,该组件发送错误的数据包,我认为问题是与发送函数只发送unicode。是否可以通过该过程发送ANSIString(Tidudpclient.send())? 这里是我使用的代码:Tidudpclient广播错误的数据

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

您发送二进制数据作为String。在XE4中,字符串是Unicode,而Indy的默认编码是ASCII。您的String数据包含超出ASCII范围的字符。

请勿将String用于二进制数据。这不是它的意思。你可以在Delphi 2007中早一点脱身,但在Delphi 2009及之后的版本中则没有。

您可以:

  1. 继续使用Send(),但告诉它,而不是使用Indy的默认编码Indy的8位编码:

    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;