用户通过Edit输入类似"ab#0Ac#AFggg#1D",要把#AF,#1D这些东西转换为AsCII字符,#AF,#1D代表十六进制,如何

  • 主题发起人 主题发起人 1_1_1_1
  • 开始时间 开始时间
1

1_1_1_1

Unregistered / Unconfirmed
GUEST, unregistred user!
用户通过Edit输入类似&quot;ab#0Ac#AFggg#1D&quot;,要把#AF,#1D这些东西转换为AsCII字符,#AF,#1D代表十六进制,如何写程序效率高??? ( 积分: 200 )<br />用户通过Edit输入类似&quot;ab#0Ac#AFggg#1D&quot;,要把#AF,#1D这些东西转换为AsCII字符,再放回它原在&quot;ab#0Ac#AFggg#1D&quot;中的位置,再把这个字符串赋给变量S,如何写程序效率高???
 
用户通过Edit输入类似&quot;ab#0Ac#AFggg#1D&quot;,要把#AF,#1D这些东西转换为AsCII字符,再放回它原在&quot;ab#0Ac#AFggg#1D&quot;中的位置,再把这个字符串赋给变量S,如何写程序效率高???
 
效率最高的话当然是
s1为要处理的字符串
b=0;
s2='';
从左到右一个个字符读;
读到#,记下位置a,
s2=copy(s1,b,a-b-1);
接着读到非数字了,再记下位置b.
取字符串s=copy(s1,a+1,b-a);
如果length(s)=0,则不理会,不用转换.
s2=s2+'#';
否则
s2=s2+(s转换成ASCII);
但读完整个字符串,如果s2='',则s2=s1;
s2就是result;
 
给你写了个函数,没有判断#后面是否是数字.
function TransAsci(const s:string):string;
var
i,J,l:integer;
begin
setlength(result,length(s));
l:=1;i:=1;
while i<=length(s) do
begin
if s='#' then
begin
j:=i+1;
while (j<=length(s)) and (s[j] >='0') and (s[j]<='9')do inc(j);
if j>i+1 then
begin
result[l]:=chr(strtoint(copy(s,i+1,j-i-1)));
inc(l);
end;
i:=j;
end else
begin
result[l]:=s;
inc(l);
inc(i);
end;
end;
setlength(result,l);
end;
 
var
Str,Num,Tmp:String;
i,j:Integer;
T:Boolean;
begin
Str:='ab#6023c#100ggg#70' ;
Tmp:='';
Repeat
i:=Pos('#',Str);
if i<=0 then break;
Tmp:=Tmp+Copy(str,0,i-1);
Delete(str,1,i);
Num:='';j:=1;
While (Str[j] in ['0'..'9'])and (j<=length(str)) do
begin
Num:=Num+str[j];inc(j);
end;
if Num<>'' then
begin
Tmp:=Tmp+chr(strtoint(num));
Delete(str,1,j-1);
end;
until i<1;
Edit2.Text:=tmp;
 
呀,什么时候改的提呀,上来一看换了
 
procedure TForm1.Button2Click(Sender: TObject);
var
pa,ss,ns:string;
i,k:integer;

begin
ss:=Edit1.Text;
i:=0;
ns:=copy(ss,0,pos('#',ss)-1);
ss:= copy(ss,pos('#',ss)+1,length(ss)-1);
while (true) do
begin
try
pa:=HexToStr(copy(ss,0,2)); //字符转成ASCII
ns:=ns+pa;
ns:=ns+copy(ss,2,pos('#',ss)-1);
except
ns:=ns+copy(ss,0,pos('#',ss)-1);
end;
ss:=copy(ss,pos('#',ss)+1,length(ss)-1);
if Length(ss)<=0 then break;
end;
Edit3.Text:=ns;
end;

转回的没有具体去做,你再看看应该没问题.
 
改进后::::
Str:='ab#0Ac#AFggg#1D' ;
Tmp:='';
Repeat
i:=Pos('#',Str);
if i<=0 then break;
Tmp:=Tmp+Copy(str,0,i-1);
Delete(str,1,i);
Num:=0;j:=1;
While (Str[j] in ['0'..'9','A'..'F','a'..'f'])and (j<=length(str)) do
begin
case str[j] of
'0'..'9':Num:=Num*16+Ord(str[j])-Ord('0');
'A'..'F':Num:=Num*16+Ord(str[j])-Ord('A')+10;
'a'..'f':Num:=Num*16+Ord(str[j])-Ord('a')+10;
End;inc(j);
end;
if Num<>0 then
begin
Tmp:=Tmp+chr(num);
Delete(str,1,j-1);
end;
until i<1;
Edit2.Text:=tmp;
end;
 
你这不是最快的办法.
Tmp:=Tmp+chr(num);
其中有大量的字符串的重复拷贝的情况.

Tmp:=Tmp+chr(num);
TMp每次都会重新申请内存,然后再拷贝字符串.肯定比我的慢.
 
Edit的text本身就是个string
第几个
可以PByte(Edit1.text):= chr(Edit1.text);
指针操作
最快
小心检查长度
越界就麻烦了
 
这是我自己做的:
//ab$41c$42ggg$7A$7Bdd把$41,$7B转换为字符
function TSMainForm.ConvertToChar(cs: string): string;
var
s,ts:string;
p,code:integer;
begin
s:=cs;
p:=pos('$',s);
while p>0 do
begin
ts:=copy(s,p,3);
try
code:=strtoint(ts);
except
end;
delete(s,p,3);
insert(char(code),s,p);
p:=pos('$',s);
end;
result:=s;
end;
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
794
import
I
后退
顶部