delphi UDP 怎么发送中文

代码如下,当直接把‘我是UDP123’发给对方的时候就没问题,如果把string转成ansichar再发送就识别不了中文why,代码如下(delphixe2,indy10... 代码如下,当直接把‘我是UDP123’发给对方的时候就没问题,如果把string转成ansichar再发送就识别不了中文why,代码如下(delphi xe2,indy10 idudpserver控件):
发送:
procedure TForm1.SpeedButton1Click(Sender: TObject);
var
MyBytes : TBytes;
Send : TSendrec;
SendStr : string;
i: Integer;
cP : PChar;
begin
if RichEdit2.Text <> '' then
begin
Sendrec.i:=MAXDWORD;
Sendrec.j:=MaxInt;
SendStr := Trim(RichEdit2.Text);
cP := PChar(SendStr);
{for i := 0 to Length(SendStr)-1 do
begin
Sendrec.Str[i] := AnsiChar(SendStr[i+1])
end; }
for i := 0 to Length(SendStr)-1 do
begin
Sendrec.Str[i] := AnsiChar(cP[i])
end;
//ShowMessage(Sendrec.Str);
//Sendrec.Str:='我是UDP123';
MyBytes:= RawToBytes(Sendrec, SizeOf(TSendrec)); //结构体 转TBYTES
BytesToRaw(MyBytes, Send, SizeOf(TSendrec)); //TBYTES 转结构体
RichEdit1.Lines.Add('你 '+Myt);
RichEdit1.Lines.Add(Send.str);
IdUDPServer1.SendBuffer(Edit1.Text, cPort, MyBytes);
RichEdit2.Clear;
Sendrec.Str := '';
end else begin
StatusBar1.Panels[0].Text := '发送消息不能为空';
end;
end;

接收:
procedure TForm1.IdUDPServer1UDPRead(AThread: TIdUDPListenerThread;
AData: TArray<System.Byte>; ABinding: TIdSocketHandle);
begin
BytesToRaw(AData, recive, SizeOf(TSendrec));
RichEdit1.Lines.Add('来自'+ABinding.PeerIP+'消息 '+Myt);
RichEdit1.Lines.Add(Recive.Str);
end;
type
TSendrec = packed record
i: DWORD;
j: Integer;
Str: array[0..1024] of AnsiChar;
end;
补充结构体是这样的
展开
 我来答
秋秋丢了
2015-06-16 · 知道合伙人文学行家
秋秋丢了
知道合伙人文学行家
采纳数:65 获赞数:8080
山西农业大学在校生

向TA提问 私信TA
展开全部
建议全部使用AnsiString操作,应该就不会有问题了...
procedure TForm1.SpeedButton1Click(Sender: TObject);
var
Sendrec : TSendrec;
SendStr : AnsiString;
begin
if RichEdit2.Text <> '' then
begin
Sendrec.i := MAXDWORD;
Sendrec.j := MaxInt;
ZeroMemory(@Sendrec.Str, SizeOf(Sendrec.Str));
SendStr := AnsiString(Trim(RichEdit2.Text));
CopyMemory(@Sendrec.Str, PAnsiChar(SendStr), Length(SendStr));
RichEdit1.Lines.Add('你 ' + Myt);
RichEdit1.Lines.Add(Sendrec.str);
IdUDPServer1.SendBuffer(Edit1.Text, cPort, RawToBytes(Sendrec.Str, SizeOf(Sendrec.Str)));
RichEdit2.Clear;
Sendrec.Str := '';
end
else StatusBar1.Panels[0].Text := '发送消息不能为空';
end;
RedBaronVIP
2012-11-16 · TA获得超过1147个赞
知道小有建树答主
回答量:655
采纳率:0%
帮助的人:233万
展开全部
基本可以肯定是Unicode版本的Delphi干出的恶心事,外加BytesToRaw、TBytes这两坨狗屎。建议全部使用AnsiString操作,应该就不会有问题了...
procedure TForm1.SpeedButton1Click(Sender: TObject);
var
Sendrec : TSendrec;
SendStr : AnsiString;
begin
if RichEdit2.Text <> '' then
begin
Sendrec.i := MAXDWORD;
Sendrec.j := MaxInt;
ZeroMemory(@Sendrec.Str, SizeOf(Sendrec.Str));
SendStr := AnsiString(Trim(RichEdit2.Text));
CopyMemory(@Sendrec.Str, PAnsiChar(SendStr), Length(SendStr));
RichEdit1.Lines.Add('你 ' + Myt);
RichEdit1.Lines.Add(Sendrec.str);
IdUDPServer1.SendBuffer(Edit1.Text, cPort, RawToBytes(Sendrec.Str, SizeOf(Sendrec.Str)));
RichEdit2.Clear;
Sendrec.Str := '';
end
else StatusBar1.Panels[0].Text := '发送消息不能为空';
end;
更多追问追答
追问
收不到消息了。。。是不是接收端的代码也应该改下。。。?

Sendrec,Recive: TSendrec;
接收也发了的 麻烦你看看 谢谢

再麻烦下大哥你.....能不能帮我附个注释.......比如ZeroMemory 这些木有看懂啊。。
如果有Indy10 udp的demo 跪求大哥发给我看看啊,找了2天都没百度到,,,,,,,
351312239@qq.com 感激不尽!
追答
Edit1.Text的地址对么?接收端好像没错啊...
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式