求救!!关于接收16进制数据的问题!!(200分)

  • 主题发起人 主题发起人 ren1983_wa
  • 开始时间 开始时间
R

ren1983_wa

Unregistered / Unconfirmed
GUEST, unregistred user!
用idtcpclient发送数据,由于要发送16进制的数据,我把文本框里面的两个合并为一个16进制数据发送。
var buffer:pchar;
str:string;
i,len:integer;
begin
i:=1;
len:=length(memo1.lines.text);
getmem(buffer,floor(len/2));//因为合并后长度减半
str:=memo1.lines.text;
while i< len do begin
buffer^:=char(hextoint(copy(str,i,2)));
inc(buffer);
inc(i,2);
end;
idtcpclient.socket.send(buffer^,floor(len/2));
end;
编译通过。运行出错。
报错:错误的指针运行。
小弟用的d7,请各位高人指点迷津!!!!!!!!!!!!请高手帮忙!!

接收数据时
用idtcpclient接收发送上来的16进制的数据,该怎么读取啊?由于分包发送回来,大楷8秒发了64k上来。
我用idtcpclient.currenbuffer都读不出来,各位高人是怎么作的啊??
我朋友用c的recv()接收到了,用delphi怎么做啊???
本来delphi中的idtcpclient.socket.recv(buf,int)和c的那个函数类似,但是我用的时候总是出错。那位高人有这方面的源码可以发给我看看吗??小弟的油箱是
ren1983.wa@163.com
小弟先行谢过各位高手!!!!!!!!!!
 
你的buffer指针在赋值后跑到后边去了,当然错误:
var buffer,p:pchar;
str:string;
i,len:integer;
begin
i:=1;
len:=length(memo1.lines.text);
getmem(buffer,floor(len/2));//因为合并后长度减半
str:=memo1.lines.text;
p:=buffer;//保存buffer的位置
while i< len do begin
buffer^:=char(hextoint(copy(str,i,2)));
inc(buffer); //此处buffer向后移动
inc(i,2);
end;
buffer:=p;//buffer置为原值
idtcpclient.socket.send(buffer^,floor(len/2));
end;
 
你的代码有两个问题:
1、内存泄漏(GetMem/FreeMem)
2、循环中你的 buffer 一直 Inc,发送时的 buffer 已经不是当初 GetMem 的 buffer 了,应该先 Dec(buffer, len shr 1)

类似的我以前写过一个高效的:
////////////////////////////////////////////////////////////////////////////////
//设计: Lsuper
//功能: 十六进制内容转换
//参数:
////////////////////////////////////////////////////////////////////////////////
function HexToBuffer(const ABuffer; ASize: Integer; var AText: string): Boolean;
////////////////////////////////////////////////////////////////////////////////
//设计: Lsuper
//功能: 编码数值
//参数:
////////////////////////////////////////////////////////////////////////////////
function GetCharOrd(C: Char): Byte;
begin
case C of
'0'..'9':
Result := Ord(C) - Ord('0');
'a'..'f':
Result := Ord(C) - Ord('a') + 10;
'A'..'F':
Result := Ord(C) - Ord('A') + 10;
else
Result := 0;
end;
end;
////////////////////////////////////////////////////////////////////////////////
//设计: Lsuper
//功能: 编码数值
//参数:
////////////////////////////////////////////////////////////////////////////////
function GetWordOrd(W: Word): Char;
var
C: array[0..1] of Char absolute W;
begin
Byte(Result) := GetCharOrd(C[0]) shl 4 + GetCharOrd(C[1]);
end;
var
nIndex: Integer;
pData: PWord;
begin
Result := False;
if ASize and 1 <> 0 then
Exit;
ASize := ASize shr 1;
SetLength(AText, ASize);
nIndex := 1;
pData := @ABuffer;
while nIndex <= ASize do
begin
AText[nIndex] := GetWordOrd(pData^);
Inc(pData);
Inc(nIndex);
end;
Result := True;
end;

////////////////////////////////////////////////////////////////////////////////
//设计: Lsuper
//功能: 十六进制内容转换
//参数:
////////////////////////////////////////////////////////////////////////////////
function HexToBuffer(const S: string; var T: string): Boolean;
begin
Result := HexToBuffer(PChar(S)^, Length(S), T);
end;
调用(注意,长度不是二的倍数是我最接退出了,你可以修改一下 :):
procedure TForm1.Button1Click(Sender: TObject);
var
str: string;
begin
if HexToBuffer(Memo1.Lines.Text, str) then
idtcpclient.Socket.Send(PChar(str)^, Length(str));
end;
 
用idtcpclient接收发送上来的16进制的数据,该怎么读取啊?由于分包发送回来,大楷8秒发了64k上来。
我用idtcpclient.currenbuffer都读不出来,各位高人是怎么作的啊??
我朋友用c的recv()接收到了,用delphi怎么做啊???
本来delphi中的idtcpclient.socket.recv(buf,int)和c的那个函数类似,但是我用的时候总是出错。那位高人有这方面的源码可以发给我看看吗??小弟的油箱是
ren1983.wa@163.com
小弟先行谢过各位高手!!!!!!!!!!
。。。。。。。。。。。LSUPER。。。。。。。。。。。。。。。
谢谢你,在你的帮助下我第一个问题解决了。我把这个问题解决了就给你派分哈。
怎么先给你一○○分呢??
 
如果用ID控件话的可以看看Delphi6中的Demo,Delphi7可以在网上下。都很简单的通过事件接收。
要想像C那样话,你在Delphi中用WinSocket就行了,和C里的方式差不多了。
WinSocket http://www.delphibbs.com/keylife/iblog_show.asp?xid=19752
 
又不是函数,控件都自动封装好了。不需要自己定义长度吧
 
谢谢各位!!!
 

Similar threads

S
回复
0
查看
744
SUNSTONE的Delphi笔记
S
S
回复
0
查看
753
SUNSTONE的Delphi笔记
S
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
915
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
后退
顶部