问题应该出在D7和XE5的字符处理上. D7默认是A 码,XE5默认 U码.

解决方案 »

  1.   

    汉字转换ASC的时候应该是双字节,在XE5里面跟踪看了下,加密后变成了单字节保存,所以也导致了解密变成了乱码,其实只有半个字节,转换不成汉字,字母大小写和数字转换都是对的。怎么改具体还要再看下。
      

  2.   

    unit ReCode;interface
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs,AnsiStrings;
    Function JiaMi(Src:String; Key:String):String;
    Function JieMi(Src:String; Key:String):String;
    implementationFunction JiaMi(Src:String; Key:String):String;
    var
      KeyLen :Integer;
      KeyPos :Integer;
      offset :Integer;
      dest :String;
      SrcPos :Integer;
      SrcAsc :Integer;
      Range :Integer;
      IntTemp:integer;
      SrcAnsi:PAnsiChar;
    begin
      KeyLen:=Length(Key);
      KeyPos:=0;
      Range:=1;
      Randomize;
      offset:=Random(Range);
      dest:=format('%1.2x',[offset]);
      SrcAnsi:=PAnsiChar(AnsiString(Src));
      IntTemp:= Length(SrcAnsi);
      for SrcPos := 1 to IntTemp do
      begin
        SrcAsc:=(Ord(SrcAnsi[SrcPos-1]) + 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 JieMi (Src:String; Key:String):String;
    var
      KeyLen :Integer;
      KeyPos :Integer;
      offset :Integer;
      dest :String;
      SrcPos :Integer;
      SrcAsc :Integer;
      TmpSrcAsc :Integer;
      Range :Integer;
      SrcAnsi:PAnsiChar;
      IntTemp,i:Integer;
      ByteArray: array of Byte;
    begin
      KeyLen:=Length(Key);
      if KeyLen = 0 then key:='starlin';
      KeyPos:=0;
      SrcPos:=0;
      SrcAsc:=0;
      Range:=1;
      offset:=StrToInt('$'+ copy(src,1,2));
      SrcPos:=3;
      IntTemp:=Length(Src) div 2;
      setlength(ByteArray,IntTemp);
      i:=0;
      repeat
        try
          SrcAsc:=StrToInt('$'+ copy(src,SrcPos,2));
        except
          SrcAsc:=StrToInt('$00');
        end;    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;
        ByteArray[i]:=TmpSrcAsc;
        i:=i+1;
        offset:=srcAsc;
        SrcPos:=SrcPos + 2;
      until SrcPos >= Length(Src);
      CopyMemory(@SrcAnsi[0],@ByteArray[0],IntTemp);
      dest:=string(AnsiStrings.strpas(SrcAnsi));
      Result:=Dest;end;end.
      

  3.   

    最近正好在做D7转XE5的工作,也正好把这方面的问题处理完,哈哈,给分吧~~
      

  4.   

    GetMem(SrcAnsi,IntTemp+1); '需要添加这句,不然会报错的
    CopyMemory(@SrcAnsi[0],@ByteArray[0],IntTemp);