rt

解决方案 »

  1.   

    Byte还是ByteArray?StringValue := Chr(ByteValue);
      

  2.   

    byte和char是一样的,直接用 char() 强制类型转换
    string是由char组成的
      

  3.   

    buf:array of byte 
    是数组
      

  4.   

    var
       str:string;
    begin
    str:=strpas(pchar(@buf[low(buf)]));
    end;
      

  5.   

    Assert(buf<>Nil);
    SetString(StrValue,PChar(@buf[0]),Length(buf));//在此之前请确保buf为非空数组
      

  6.   

    不好意思我是用udpserver控件接受客户端发送过来的数据
    不知道这样写行不行
    procedure TUDPMainForm.UDPServerUDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle);
    var
      s: String;
      buf:array of byte;
    begin
      setlength(buf,adata.size);
      adata.Read(buf,adata.Size);
      if buf<>nil then
      SetString(S,PChar(@buf[0]),Length(buf));
      UDPMemo.Lines.Add(s);
    end;
      

  7.   

    procedure TUDPMainForm.UDPServerUDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle); 
    var 
      s: String; 
      buf:array of byte; 
    begin 
      setlength(buf,adata.size); 
      adata.Read(buf,adata.Size); 
      s:=strpas(pchar(@buf[low(buf)]));  
      UDPMemo.Lines.Add(s); 
    end;
    这样也不行啊
      

  8.   

    procedure TUDPMainForm.UDPServerUDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle);  
    var  
      s: String;  
    begin  
      SetString(S,AData.Memory,AData.Size);
      UDPMemo.Lines.Add(s);  
    end; 
      

  9.   

    var
    st:TStringStream;
    begin
    st:=TStringStream.Create('');
    st.CopyFrom(AData,AData.Size);
    UDPMemo.Lines.Add(st.DataString);
      

  10.   

    这样试一下:
       var 
        s:String;
        oStream:TStream;
      begin
        oStream:=TStringStream.Create(s);
        oStream.CopyFrom(AData,Adata.size);
        oStream.Free;
        UDPMemo.Lines.Add(s);  
      end;
      

  11.   

    to:unsigned
    还是不行啊,编译时提示:没有定义memory另外
    var  
        s:String; 
        oStream:TStream; 
      begin 
        oStream:=TStringStream.Create(s); 
        oStream.CopyFrom(AData,Adata.size); 
        oStream.Free; 
        UDPMemo.Lines.Add(s);   
      end;
    是demo里面自带的,本身就可以的,我是想用byte的方式接受一下,看行不行,但是又不知道怎么转换?
      

  12.   

    如果转换的话,直接用s:=pchar(@buf);不行吗?
      

  13.   

    使用TStringStream或者array of byte等等,其中都多了一个复制动作.为了防止存在#0等特殊字符不被截断,最好的办法是先对目标串(String)分配内存(SetLength),然后复制过去.而SetString则把这一步给做了.另外SetLength跟SetString又有一个差别,SetString会重新生成一个String,而SetLength在当前String有足够内存的情况下将是直接扩充长度计数,而不再重新分配内存.
      

  14.   

    补充一点:
    不再重新分配内存还有一个条件是引用计数为1,即只有当前String引用到该地址.
      

  15.   

    我一直没有搞清楚,bytge,char,pchar都是些什么类型的数据,跟string之间怎么转换,头疼得很,希望各位大大都来说说,分不够我在追加就是了
      

  16.   

    byte:字节,转Char(字符)用Char:=Chr(Byte),反之用Byte:=Ord(Char);
    Char:字符
    PChar:字符指针,或者字符串首地址,默认以#0结尾表示一整个完整的串.
    String:字符串,多个连续的字符组合.
    Char:=PChar^,PChar:=@Char;
    String:=Char,String:=Char+Char,String:=String+Char,String:=Char+String;
      

  17.   

    var   
            cmd:string;   
      begin   
            AData.Seek(0,0);   
            SetLength(cmd,AData.size);   
            AData.Read(cmd[1],AData.Size);   
            showmessage(cmd);   
      end;  
      

  18.   

    var
      RcvBuffer: array of Byte;
      i        : Integer;
      ViewStr  : String;
    begin
      SetLength(RcvBuffer, AData.Size);
      AData.Seek(0, soFromBeginning);
      AData.ReadBuffer(RcvBuffer, AData.Size);
      ViewStr := '接收';
      for i := 0 to AData.Size - 1 do
        ViewStr := ViewStr + ' ' + IntToHex(RcvBuffer[i], 2);
      memo1.Lines.Add(ViewStr);
      RcvBuffer := nil;
    end;
      

  19.   

    代码资料挺全,推荐一下:http://www.ciitc.com