难道 delphi 中有 类似VB的 Split( )、Chr( ) 函数 ?VB代码 GetNumber("&H" & Cipher(i)) 会把 Cipher(i) 中的字符串转换成对应的 Long 整数,再调用 GetNumber( ) 函数。
如果 delphi 中没有把“数值字符串”转换成相应数据的函数,你自己写一个也很容易吧!

解决方案 »

  1.   

    有这些函数,&H 代表的是 hex类型吗?delphi是强类型语言,&HB2 和 &HB209  代表的是什么呢?是数值型的转换为hex类型吗?大牛
      

  2.   

    VB中,16进制数就是以 &H开头啊。
      

  3.   

     For i = 0 To UBound(Cipher)
        Plain = Plain & GetNumber("&H" & Cipher(i))    这句是什么意思呢? 从0开始循环,   UBound(Cipher) //返回计算long型的 数? 不行,基础太差 
      

  4.   

    我不清楚 delphi 中是如何表示16进制的。
    但我说C++的,你应该是明白的吧,你参考一下:VB6.0      C++          10进制数
    &HB2      0xb2           178
    &HB209     (short)0xb209      -19959 
    &HB209&     0xb209L         45577
     这儿后面的&表示Long类型)
      

  5.   

    UBound(Cipher) 是返回数组 Cipher 的下标“上界”,Cipher是用 Split( )的结果赋值的,它的数组下标是从0开始,下标上界 =  元素个数 - 1
      

  6.   

    VB6 中的 Hex$( )函数,是返回一个整数的“16进制字符串”,当然它的这个返回结果是没有 &H前缀的。
    比如:
     hex$(100) = 64
     hex$(200) = C8
    这儿的100、200是10进制的数,64是字符串的 "64", C8是字符串的 "C8"。
      

  7.   

    不过谢谢大神,我似乎又有了目标,在学校学生会,天天看一帮流氓耍心眼,这次明白了,技术和认真的人从心里让人佩服。大侠,我解决了,多次测试发现,问题出在了  chr 函数上,delphi7 的chr 大于128 转换出来的字符串就有问题了(或者是我的程序就有问题了)代码如下:
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        Edit1: TEdit;
        Memo1: TMemo;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}function HexStrToStr(const S:string):string;
    var
    t:Integer;
    ts:string;
    M,Code:Integer;
    begin
    t:=1;
    Result:='';
    while t<=Length(S) do
    begin   //xlh 2006.10.21
        while (t<=Length(S)) and (not (S[t] in ['0'..'9','A'..'F','a'..'f'])) do
          inc(t);
        if (t+1>Length(S))or(not (S[t+1] in ['0'..'9','A'..'F','a'..'f'])) then
          ts:='$'+S[t]
        else
          ts:='$'+S[t]+S[t+1];
        Val(ts,M,Code);
        if Code=0 then
          Result:=Result+Chr(M);
        inc(t,2);
    end;
    end;
    // 这个递归函数有点看不懂,if 和 else里都做了递归,这不是没有递归出口的死循环了么
    function GetNumber(num: Integer): String;
    begin
      if num < 256 then
        Result := chr(Num Xor $B2)     //GetNumber(Byte(num xor $B2))
      else
         result := HexStrToStr(intToHex(num xor $B209,4));
        //Result := IntToStr(Num Xor $B209 );   //GetNumber(Byte(num xor $B209))
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    var
      cipher: TStringList;
      plain: AnsiString;
      i: Integer;
      desStr: AnsiString;
    begin
      desStr :='0BEA@64D4@78D9@08AA@64E0@75F1@76C6@06EC@70BE@80@82@08CC@83@04B9@64A7@60B2@87@82@81@05B6';
      cipher := TStringList.Create;
      ExtractStrings(['@'], [], PAnsiChar(desStr), cipher);
      try
        for i := 0 to cipher.Count - 1 do
        begin
          plain := plain + GetNumber(StrToInt('$' + cipher[i]));
        end;
        memo1.lines.add(plain);
      finally
        cipher.Free;
      end;
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
    showMessage((intTOHex(47587,4)));
    end;end.
      

  8.   

    function GetNumber( ) 不是“递归”啊,只是一个条件分支嘛。我先说原 VB代码吧:
    Private Function GetNumber(ByVal Num As Long) As String
    更贴切的命名,应该是:
    Private Function GetDecChar(ByVal Num As Long) As String
    它的作用是,按一个“加密的编码”,返回解密后对应的字符(可能是西文字符,也可能是汉字)。按原来的“加密算法”,
      标准的ASCII字符码 在加密后,其值的范围是128~255(因为只有1字节)。
      加密后的值如果>256的,肯定就是汉字。
    (注意这儿我的语句描述,有“内涵”的 ,等下再给你说这个)再看你的 Delphi代码:
    function GetNumber(num: Integer): String;
    begin
      if num < 256 then
        Result := chr(Num Xor $B2)     //GetNumber(Byte(num xor $B2))
      else
         result := HexStrToStr(intToHex(num xor $B209,4));
        //Result := IntToStr(Num Xor $B209 );   //GetNumber(Byte(num xor $B209))
    end;if num < 256 then    Result := chr(Num Xor $B2)
    那对汉字的“解密”,怎么变成了:result := HexStrToStr(intToHex(num xor $B209,4)); 呢?
    ① Result 大小写不一致, Delphi应该是要区分大小写的吧?
    ② 怎么不用 Result := chr(num xor $B209); 难道它不能支持双字节的字符编码?
      

  9.   

    再说一下我在 11F 所说的“内涵”吧。如果他采用的加密算法真的是 “对西文字符码 Xor &HB2、对汉字GB2312编码 Xor &HB209”,
    (按楼主前一次那个贴子的“实例”来看,确实应该是这样的)
    我就认为: 它的这个加密算法就存在一种严重的缺陷!再提一下我在 11F 的“内涵描述”吧,前一句“标准的ASCII字符码 在加密后,其值的范围是128~255”。
    这个说法肯定没错,标准ASCII字符码的范围是0~127(或说是1~127吧,虽然不是全部是“可显示字符”),
    它们 xor &HB2 的结果,最高位由0变成1了,自然就是 128~255的范围了。
    但是,我为什么没说“汉字加密后的编码大于等于256”呢?
    其实,问题就在于,它的这个加密算法,有一些汉字经“加密→解密”后,由汉字变成了“ASCII字符”!举个例子吧: “拼搏”这个詞,汉字的 GB2312码是: &HC6B4 &HB2AB
      加密后: &H74BD &HA2
    注意第2个字的加密后密码值:&HA2 = 162 ,这个162就在128~255之间了,解密还能把它还原出汉字吗?显示,已经不能正确解密了…………