function encode($input)

$FlashFXP_Key = "yA36zA48dEhfrvghGRg57h5UlDv3"; 
if($input=="") return ""; 
$key = rand(1,255); 
//$key = 15;   //调试用的echo "动态Key".$key."<br>";      //随机255的数
if($key >0x0F){   //10进制的15
$result = strtoupper(dechex($key));    //10进制转换成16进制并大写
}else{ 
$result = "0".strtoupper(dechex($key));  //不足15     10进制的15是字母F补0就是0F了并大写
} $magic_number = $key; echo "magic_number".$magic_number."<br>";  //返回值貌似和上面的随机Key一样没变化……$result = strval($result);   //将16进制的数字转换成字符串类型echo "result".$result."<br>";  for($i=0;$i<strlen($input);$i++){ 
 
echo ord($input[$i])+$magic_number."循环次数".$i."<br>"; if(ord($input[$i])+$magic_number>0xFF)   //判断明文相应字符的10进制数加随机key是否大于255 (16进制就是0XFF)$magic_number = (ord($input[$i])+$magic_number - 0xFF)^(ord($FlashFXP_Key[$i%28]));  //大于255就减去255 然后在和密匙的相应位置的数值xor计算
else 
$magic_number = (ord($input[$i])+$magic_number)^(ord($FlashFXP_Key[$i%28]));  //不大于255直接xor 密匙相应位置的数值if($magic_number>0x0F)   //10进制的15
$result .= dechex($magic_number);    //直接16进制
else 
$result = $result."0".dechex($magic_number); //16进制后 补0 (并加上面的Key的16进制)
} $result = strtoupper($result);   //全部转换大写字母
return $result;
} 这是一个PHP的函数源码,我想转换成 delphi的,但PHP的16进制和10进制转换和delphi 的不同,还有异或运算我也不熟悉,写出来的代码得不到想要的结果,请懂PHP的朋友帮忙转换一下,转成delphi的,多谢了

解决方案 »

  1.   

    Encode是自定义函数,加密功能
      

  2.   

    大概看看吧function encode(input:string):string;
    var
      FlashFXP_Key : string;
      i,key,magic_number :Integer;
    begin
      FlashFXP_Key := 'yA36zA48dEhfrvghGRg57h5UlDv3';
      if(input = '') then
      begin
        Result := '';
        Exit;
      end;
      key := Random(255);
      //下面的显示,你随便写
      ShowMessage('动态Key'+IntToStr(key));
    if(key >$F) then
    begin
      Result := Format('%x',[key]);
    end
    else
    begin
      Result := '0'+Format('%x',[key]);   //不知道你的dechex是什么,如果是补0,format也可以实现,自己查吧
    end;  magic_number := key;
      ShowMessage('magic_number'+IntToStr(magic_number));
      for i:=0 to Length(input)-1 do
      begin
        ShowMessage('循环次数'+IntToStr(i));
        if Ord(input[i])+magic_number > $FF then
        begin
          magic_number := (Ord(input[i])+magic_number - $FF) xor Ord(FlashFXP_Key[i mod 28]);
        end
        else
        begin
          magic_number := (Ord(input[i])+magic_number) xor Ord(FlashFXP_Key[i mod 28]);
        end;
        if magic_number > $0F then
          Result := Format('%x',[magic_number])
        else
          Result := Result + '0'+ Format('%x',[magic_number]);
      end;
      Result := UpperCase(Result); //全部转换大写字母
    end;
      

  3.   

    #2楼基本正确,只是看错了
    $result .= dechex($magic_number); //直接16进制
    少看了个"."所以要改
    Result := Format('%x',[magic_number])

    Result := Result+Format('%x',[magic_number])
    输出我也稍改了下,与原来完全一致,在D6上运行完全吻合注意,在D2007以上版本,要改String为AnsiString,并改所有"..."字串为AnsiString("...");
    AnsiString
    function encode(input:string):string;
    var
      FlashFXP_Key : string;
      i,key,magic_number :Integer;
    begin
      FlashFXP_Key := 'yA36zA48dEhfrvghGRg57h5UlDv3';
      if(input = '') then
      begin
        Result := '';
        Exit;
      end;
      key := Random(255);
     //  key:=15;
      //下面的显示,你随便写
      ShowMessage('动态Key'+IntToStr(key));
    if(key >$F) then
    begin
      Result := Format('%x',[key]);
    end
    else
    begin
      Result := '0'+Format('%x',[key]);   //不知道你的dechex是什么,如果是补0,format也可以实现,自己查吧
    end;  magic_number := key;
      ShowMessage('magic_number'+IntToHex(magic_number,2));
      ShowMessage('result'+result+'<br>');
      for i:=1 to Length(input) do
      begin
        ShowMessage(IntToStr(ord(input[i])+magic_number)+'循环次数'+IntToStr(i));
        if Ord(input[i])+magic_number > $FF then
        begin
          magic_number := (Ord(input[i])+magic_number - $FF) xor Ord(FlashFXP_Key[i mod 28]);
        end
        else
        begin
          magic_number := (Ord(input[i])+magic_number) xor Ord(FlashFXP_Key[i mod 28]);
        end;
        if magic_number > $0F then
          Result :=Result + Format('%x',[magic_number])
        else
          Result := Result + '0'+ Format('%x',[magic_number]);
      end;
      Result := UpperCase(Result); //全部转换大写字母
    end;
      

  4.   

    我自已写的代码,主要是下面几句写不对:
    if Ord(input[i])+magic_number > $FF then
        begin
          magic_number := (Ord(input[i])+magic_number - $FF) xor Ord(FlashFXP_Key[i mod 28]);
        end
        else
        begin
          magic_number := (Ord(input[i])+magic_number) xor Ord(FlashFXP_Key[i mod 28]);
        end;