不好意思我是用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;
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; 这样也不行啊
procedure TUDPMainForm.UDPServerUDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle); var s: String; begin SetString(S,AData.Memory,AData.Size); UDPMemo.Lines.Add(s); end;
var st:TStringStream; begin st:=TStringStream.Create(''); st.CopyFrom(AData,AData.Size); UDPMemo.Lines.Add(st.DataString);
这样试一下: var s:String; oStream:TStream; begin oStream:=TStringStream.Create(s); oStream.CopyFrom(AData,Adata.size); oStream.Free; UDPMemo.Lines.Add(s); end;
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的方式接受一下,看行不行,但是又不知道怎么转换?
如果转换的话,直接用s:=pchar(@buf);不行吗?
使用TStringStream或者array of byte等等,其中都多了一个复制动作.为了防止存在#0等特殊字符不被截断,最好的办法是先对目标串(String)分配内存(SetLength),然后复制过去.而SetString则把这一步给做了.另外SetLength跟SetString又有一个差别,SetString会重新生成一个String,而SetLength在当前String有足够内存的情况下将是直接扩充长度计数,而不再重新分配内存.
string是由char组成的
是数组
str:string;
begin
str:=strpas(pchar(@buf[low(buf)]));
end;
SetString(StrValue,PChar(@buf[0]),Length(buf));//在此之前请确保buf为非空数组
不知道这样写行不行
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;
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;
这样也不行啊
var
s: String;
begin
SetString(S,AData.Memory,AData.Size);
UDPMemo.Lines.Add(s);
end;
st:TStringStream;
begin
st:=TStringStream.Create('');
st.CopyFrom(AData,AData.Size);
UDPMemo.Lines.Add(st.DataString);
var
s:String;
oStream:TStream;
begin
oStream:=TStringStream.Create(s);
oStream.CopyFrom(AData,Adata.size);
oStream.Free;
UDPMemo.Lines.Add(s);
end;
还是不行啊,编译时提示:没有定义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的方式接受一下,看行不行,但是又不知道怎么转换?
不再重新分配内存还有一个条件是引用计数为1,即只有当前String引用到该地址.
Char:字符
PChar:字符指针,或者字符串首地址,默认以#0结尾表示一整个完整的串.
String:字符串,多个连续的字符组合.
Char:=PChar^,PChar:=@Char;
String:=Char,String:=Char+Char,String:=String+Char,String:=Char+String;
cmd:string;
begin
AData.Seek(0,0);
SetLength(cmd,AData.size);
AData.Read(cmd[1],AData.Size);
showmessage(cmd);
end;
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;