[ConnectString]
UserName='
PassWord=
DataBaseName=
ServerName=我的一个INI文件被我加密后, 使用 sTmpStr := ReadString('ConnectString', 'UserName', '');这样只能获取'这个字符,而这个获取不到"". 郁闷!

解决方案 »

  1.   

    procedure TForm2.Button2Click(Sender: TObject);
    const
      cStr = 'Temp';
    var
     sStr, sTmpStr, dTmpStr: String;
     I, J, iLen, iKey: Integer;
    begin
      sStr := Edit3.Text;
      iLen := length(sStr);
      iKey := length(cStr);
      J := 1;
      for I := 1 to iLen do
      begin
        sTmpStr := sTmpStr + Char(ord(sStr[I]) xor ord(cStr[J]));
        if J = iKey then
        begin
          J := 1;
          Continue;
        end;
        Inc(J);
      end;
      Edit1.Text :=  sTmpStr;
      dTmpStr := '';
      iLen := length(sTmpStr);
      J := 1;
      for I := 1 to iLen do
      begin
        dTmpStr := dTmpStr + Char(ord(sTmpStr[I]) xor ord(cStr[J]));
        if J = iKey then
        begin
          J := 1;
          Continue;
        end;
        Inc(J);
      end;
      Edit2.Text := dTmpStr;
    end;
    我的简单加密算法是这样的!
    拿个是输入"sa"后保存到Ini文件.
    但在INI文件读不完整数据出来. 但我的
    加密解密测试是可以的.
      

  2.   

    INI文件认为"sa"中的sa是真正的数据,呵呵
      

  3.   

    你可以动态操作ini文件,就是把加密后的数据存放在ini文件中,读取后先解密,再使用不就行了吗
      

  4.   

    我的意思是只对ini里面的内容加密
      

  5.   

    各位! 我就是先加密然后存到INI文件的! 
    在我从INI文件读出来之后, 再进行解密.
    可是我跟踪到是在读INI文件的sTmpStr := ReadString('ConnectString', 'UserName', '');
    出问题了! 在加密的时候已经正确的写入了数据.
    但在读的时候就读出不完整的数据了! 郁闷啊.
      

  6.   

    [ConnectString]
    UserName='
    PassWord=
    DataBaseName=
    ServerName=
    你是不是连userName 都加密了,看了半天没看懂
    sTmpStr := ReadString('ConnectString', 'UserName', '');
    你的本来就是' 读出来肯定也是' 把'用你自己的解密算法算出来 就是sa了。
    把你的
    Button2Click写成一个函数吧。这没什么问题啊。
      

  7.   

    procedure TForm1.Button2Click(Sender: TObject);
    var
    s: string;
    inifile: TIniFile;
    strLocalName: string;
    begin
     //s := extractfilepath(application.exename);    UserName='
     s:='c:\1.ini';
     inifile:=TIniFile.Create(s);
     strLocalName:=Encode(inifile.readstring('ConnectString','UserName',''));
     edit2.text:=strLocalName;
     inifile.free;
    end;procedure TForm1.Button3Click(Sender: TObject);
    var
    s: string;
    inifile: TIniFile;
    strLocalName: string;
    begin
     //s := extractfilepath(application.exename);    UserName='
     s:='c:\1.ini';
     inifile:=TIniFile.Create(s);
     inifile.writestring('ConnectString','UserName',''''+Encode(Edit1.Text)+'''');
     edit1.text:=strLocalName;
     inifile.free;
    end;function TForm1.Encode(Str: string): string;
    const
      cStr = 'Temp';
    var
    s,sStr: string;
    inifile: TIniFile;
    strLocalName: string;
     sTmpStr, dTmpStr: String;
     I, J, iLen, iKey: Integer;
    begin
      sStr := Str;
      iLen := length(sStr);
      iKey := length(cStr);
      J := 1;
      for I := 1 to iLen do
      begin
        sTmpStr := sTmpStr + Char(ord(sStr[I]) xor ord(cStr[J]));
        if J = iKey then
        begin
          J := 1;
          Continue;
        end;
        Inc(J);
      end;
      Result:=sTmpStr;
      Edit1.Text :=  sTmpStr; //加密后的
    end;
      

  8.   

    楼上的是在读取INI文件的:UserName 出问题的。
    你试一下加密后存到INI文件,然后再从INI文件
    读取,再解密看你能得到正确的‘sa'吗? 谢谢!
      

  9.   

    楼上的: 我不存进INI文件进行测试一点问题都没有!
    可是存进INI文件之后,就是ReadString读少了一个字符。
    在INI文件里面也确实存在的。
      

  10.   

    是空格的问题
    inifile.writestring('ConnectString','UserName',''''+Encode(Edit1.Text)+'''');
    写的时候用分号括起来
      

  11.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls,inifiles;type
      TForm1 = class(TForm)
        Button1: TButton;
        Button2: TButton;
        Edit1: TEdit;
        Edit2: TEdit;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        function Encode(str : string): string;
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    var
    s: string;
    inifile: TIniFile;
    strLocalName: string;
    begin
     //s := extractfilepath(application.exename);    UserName='
     s:='c:\1.ini';
     inifile:=TIniFile.Create(s);
     strLocalName:=Encode(inifile.readstring('ConnectString','UserName',''));
     edit2.text:=strLocalName;
     inifile.free;
    end;procedure TForm1.Button2Click(Sender: TObject);
    var
    s: string;
    inifile: TIniFile;
    strLocalName: string;
    begin
     //s := extractfilepath(application.exename);    UserName='
     s:='c:\1.ini';
     inifile:=TIniFile.Create(s);
     inifile.writestring('ConnectString','UserName',''''+Encode(Edit1.Text)+'''');
     inifile.free;
    end;function TForm1.Encode(Str: string): string;
    const
      cStr = 'Temp';
    var
    s,sStr: string;
    inifile: TIniFile;
    strLocalName: string;
     sTmpStr, dTmpStr: String;
     I, J, iLen, iKey: Integer;
    begin
      sStr := Str;
      iLen := length(sStr);
      iKey := length(cStr);
      J := 1;
      for I := 1 to iLen do
      begin
        sTmpStr := sTmpStr + Char(ord(sStr[I]) xor ord(cStr[J]));
        if J = iKey then
        begin
          J := 1;
          Continue;
        end;
        Inc(J);
      end;
      Result:=sTmpStr;
     // Edit1.Text :=  sTmpStr; //加密后的
    end;
    end.
      

  12.   

    加密的函数生成的密文,可能有不可打印字符,这样ReadString可能会出问题。
    加密的密文最好加上 '...'  ,引号引起来。
      

  13.   

    1.密码最好换成内码的ASCII值字符串如密文为 1A0 则换成 314130 这样就不会丢失字符啦2.INI文件字串首或串尾母如果是空格或一些特殊字符会丢掉滴可以如楼上所说,补头加尾