TMemo控件的有关问题

TMemo控件的问题
Delphi(Pascal) code

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Button1: TButton;
    Button2: TButton;
    Memo1: TMemo;
    Button3: TButton;
    Button4: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
 function EncryptString(Source, Key: string): string;
// 对字符串加密(Source:源 Key:密匙)
var
 KeyLen: integer;
 KeyPos: integer;
 Offset: integer;
 Dest: string;
 SrcPos: integer;
 SrcAsc: integer;
 Range: integer;
begin
 KeyLen := Length(Key);
 if KeyLen = 0 then
 Key := 'delphi';
 KeyPos := 0;
 Range := 256;
 randomize;
 Offset := random(Range);
 Dest := format('%1.2x', [Offset]);
 for SrcPos := 1 to Length(Source) do
 begin
 SrcAsc := (Ord(Source[SrcPos]) + Offset) mod 255;
 if KeyPos < KeyLen then
 KeyPos := KeyPos + 1
 else
 KeyPos := 1;
 SrcAsc := SrcAsc xor Ord(Key[KeyPos]);
 Dest := Dest + format('%1.2x', [SrcAsc]);
 Offset := SrcAsc;
 end;
 result := Dest;
end;
 
function UnEncryptString(Source, Key: string): string;
// 对字符串解密(Src:源 Key:密匙)
var
 KeyLen: integer;
 KeyPos: integer;
 Offset: integer;
 Dest: string;
 SrcPos: integer;
 SrcAsc: integer;
 TmpSrcAsc: integer;
begin
 KeyLen := Length(Key);
 if KeyLen = 0 then
 Key := 'delphi';
 KeyPos := 0;
 Offset := strtoint('$' + copy(Source, 1, 2));
 SrcPos := 3;
 repeat
 SrcAsc := strtoint('$' + copy(Source, SrcPos, 2));
 if KeyPos < KeyLen then
 KeyPos := KeyPos + 1
 else
 KeyPos := 1;
 TmpSrcAsc := SrcAsc xor Ord(Key[KeyPos]);
 if TmpSrcAsc <= Offset then
 TmpSrcAsc := 255 + TmpSrcAsc - Offset
 else
 TmpSrcAsc := TmpSrcAsc - Offset;
 Dest := Dest + chr(TmpSrcAsc);
 Offset := SrcAsc;
 SrcPos := SrcPos + 2;
 until SrcPos >= Length(Source);
 result := Dest;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   edit2.Text := EncryptString(edit1.Text,'1');
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
   edit3.Text := UnEncryptString(edit2.Text,'1');
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  Memo1.Lines.Clear;
  Memo1.Lines.Add(EncryptString(edit1.Text,'1'));
  Memo1.Lines.SaveToFile('c:\1.txt');
  edit2.Text := Memo1.Text;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
  Memo1.Lines.Clear;
  Memo1.Lines.LoadFromFile('c:\1.txt');
  edit3.Text := UnEncryptString(Memo1.Text,'1');
end;

end.


在网上找了一个加密解密的函数
1.如果直接加密文本到文本框,然后再把文本框内容解密是可以的

2.但是如果把加密后的内容通过Memo存入到文件中,再将文件里的内容解密就会报错 
'$' is not a valid integer value 

我看过了通过1方法和通过2方法加密的结果是一样的

------解决方案--------------------
SaveToFile函数会在后面加上回车和换行符,所以txt文件中内容会多出2个字符
解密时要把后面的回车换行去掉就行了