我想作一个简单的数字数据加密函数,但是在运行就是达不到效果,源码如下(测试用的源码)
{$R *.dfm}
function chartonum(const valus:integer):char;  //加密函数
begin
case valus of
 1:result:=chr(valus+64);
 2:result:=chr(valus+70);
 3:result:=chr(valus+72);
 4:result:=chr(valus+58);
 5:result:=chr(valus+83);
 6:result:=chr(valus+67);
 7:result:=chr(valus+75);
 8:result:=chr(valus+78);
 9:result:=chr(valus+80);
 end;
end;procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
tstr:string;
begin
  tstr:='';
  for i:=1 to length(edit1.Text) do
  begin
  tstr:=chartonum(strtoint(copy(edit1.Text,i,1)));
  tstr:=tstr+tstr;
  end;
  edit2.Text:=tstr;
end;
end.
问题是我想借tstr来累加起来赋值到edit2中显示在edit1中输入数字后的加密情况,如edit1中输入‘12345’,本在edit2中就显示“AHK>X”可是现在只显示最后一个“XX”,也就是讲tstr:=tstr+tstr;并没有累加上去。不知这种算法是怎样的写,同时反过来解码的函数试了几次都编译不过,有高人能否指点一二解密函数
  function numtochar(const nstr:string):integer;
begin
if nstr='A' then
  result:=strtoint(nstr-64);
 if nstr='H' then
  result:=strtoint(nstr-70);
....
end;

解决方案 »

  1.   

    tstr:=tstr+tstr;晕倒。。另外定义一个字符串吧。比如。strSum
    strSum:=strSum+tstr;
      

  2.   

    你的这种加解密属于查表法, 帮你改了一下, 代码很简单, 不解释了, 就请你自己去理解了:const
      KeyList = 'AHK>XIRVY';function Encrypt(AString: String): String;
    var
      iLoop : Integer;
    begin
      Result := '';
      for iLoop := 1 to Length(AString) do
        if AString[iLoop] in ['1'..'9'] then
          Result := Result + KeyList[Ord(AString[iLoop]) - Ord('0')];
    end;function DeEncrypt(AString: String): String;
    var
      iLoop : Integer;
      iPos  : Integer;
    begin
      Result := '';
      for iLoop := 1 to Length(AString) do
      begin
        iPos := Pos(AString[iLoop], KeyList);
        if iPos > 0 then Result := Result + Chr(iPos + Ord('0'));
      end;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      Edit2.Text := Encrypt(Edit1.Text);
      ShowMessage(DeEncrypt(Edit2.Text));
    end;
      

  3.   

    result:=strtoint(nstr-64);
    你的nstr是string类型,不能直接来-64的。。
    可以像楼上这么
    result:=ord(nstr)-64;
      

  4.   

    哦,但这也有一个问题,为何放‘0’进去就不行呢,
    if AString[iLoop] in ['0'..'9'] then
     edit2中什么都没有,假如edit1中有0的话
      

  5.   

    function numtochar(var nstr:string):integer;  这个解码函数可以了
    begin
     if nstr='A' then
       result:=strtoint(chr(strtoint(nstr)-64));
       if nstr='U' then
       result:=strtoint(chr(strtoint(nstr)-85));
        if nstr='H' then
       result:=strtoint(chr(strtoint(nstr)-70));
       if nstr='K' then
       result:=strtoint(chr(strtoint(nstr)-72));
       if nstr='>' then
       result:=strtoint(chr(strtoint(nstr)-58));
       if nstr='x' then
       result:=strtoint(chr(strtoint(nstr)-83));
    ....
       end;
    procedure TForm1.Button2Click(Sender: TObject);
    var
    n:integer;
    ystr,kstr:integer;
    begin
      for n:=1 to length(edit1.Text) do
      begin
      ystr:=numtochar(copy(edit1.Text,n,1)); 但是这里却编译不过,不知是为什么
      kstr:=kstr+ystr;
      end;
      edit2.Text:=inttostr(kstr);
    end;
    end;
      

  6.   

    要支持0的话:const
      KeyList = '?AHK>XIRVY';   //?是0对应的加密后的字符function Encrypt(AString: String): String;
    var
      iLoop : Integer;
    begin
      Result := '';
      for iLoop := 1 to Length(AString) do
        if AString[iLoop] in ['0'..'9'] then
          Result := Result + KeyList[Ord(AString[iLoop]) - Ord('0') + 1];
    end;function DeEncrypt(AString: String): String;
    var
      iLoop : Integer;
      iPos  : Integer;
    begin
      Result := '';
      for iLoop := 1 to Length(AString) do
      begin
        iPos := Pos(AString[iLoop], KeyList);
        if iPos > 0 then Result := Result + Chr(iPos + Ord('0') -  1);
      end;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      Edit2.Text := Encrypt(Edit1.Text);
      ShowMessage(DeEncrypt(Edit2.Text));
    end;
      

  7.   

    ystr:=numtochar(copy(edit1.Text,n,1));你那个变量是integer,copy的返回是char,numtochar写反了。应该是ord()(忘了是不是这个了。。)
      

  8.   

    建议:完整的加密过程应该增加一个else条件,如下:const
      KeyList = 'AHK>XIRVY';function Encrypt(AString: String): String;
    var
      iLoop : Integer;
    begin
      Result := '';
      for iLoop := 1 to Length(AString) do
        if AString[iLoop] in ['1'..'9'] then
          Result := Result + KeyList[Ord(AString[iLoop]) - Ord('0')]
        else
          Reusut := Result + Astring[iLoop];
    end;=========================================
    路过...
      

  9.   

    tstr:=chartonum(strtoint(copy(edit1.Text,i,1)));
      tstr:=tstr+tstr;这边不是明显的错误吗
    你让tstr=chartonum()后整个变量的值都改变了
    后面再tstr:=tstr+tstr;有什么用。
    由于你是放在循环里的,所以到了最后就变成tmp:=chartonum(Right(edit1.text,1));result:=tmp+tmp;了
      

  10.   

    大家好啊!我是个新手,刚刚DELPHI起步,请大家帮帮我,教我怎么学会高级编程以及心得。