function Decrypt(const S: String): String;
var
  I: byte;
  Key: Word;
begin
  Key := Keyword;
  SetLength(Result,Length(S));
  for I := 1 to Length(S) do
  begin
    Result[I] := char(byte(S[I]) xor (Key shr 8));
    Key := (byte(S[I]) + Key) * 21469+ 12347;
  end;
end;
已知(byte(S[I]) + Key) * 21469+ 12347的计算结果为:570636898但Key的数据类型为word输出Key 的时候结果不是570636898呢?输出的时候key 是一个比570636898小很多的值,没有超过65535的上限

解决方案 »

  1.   

    messagebox(inttostr((byte(S[I]) + Key) * 21469+ 12347))
    570636898
      

  2.   

    你变量Key定义为Word,而Word类型的数据范围是0-65535。你给Key那么大一个值不就超出它的范围了!你可以把Key定义成Integer或其它在范围内的数据类型。
      

  3.   


    我现在的问题就是给
    Key := (byte(S[I]) + Key) * 21469+ 12347; 
    这一句它不会出错
    并且我messagebox输出Key 和(byte(S[I]) + Key) * 21469+ 12347的值不一样!
      

  4.   

    2楼说得不错
    不要把
      Key: Word改成
      Key: Integer
      

  5.   


    Key := (byte(S[I) + Key) * 21469+ 12347;]
    大哥这代码不是我写的,而是正常运行的程序里面取出来的!
    messagebox(inttostr((byte(S[I]) + Key) * 21469+ 12347)) 弹出来是570636898
    messagebox(inttostr((byte(S[I]) + Key) * 21469+ 12347))弹出来是40000多的值等式两边不一样,谁能告诉我为什么?
      

  6.   


    一个是 word值,   word值是不会超过 65535的
    你一个 word值  65535  你再+1 就变成0了
    下面那个是 从 integer 转成 str的, 所以他不受 限制.
      

  7.   

    您好,请问可以解释的细一些吗?
    我不是学Delphi的我用的是.net正在翻译这个函数按照您的意思就是说40000是570636898除以N得出来的余数是吗?
      

  8.   

    Key := (byte(S[I) + Key) * 21469+ 12347;]原作者的情况有以下两种:
    1.这句的意思是KEY值等于后面结果取低8位,相当于KEY=word(*);
    2.错误的估计了值的范围,本来需要integer的用了word
      

  9.   

    纠正一下上面一句,是低16位.
    这个函数应该是个加密或解密字符串的,按我的理解简单解释一下,希望对你有用.function Decrypt(const S: String): String;
    //函数参数和返回值都是字符串,如果不是delphi2010及以后版本写的,那这个就是ansi字符串,
    var
      I: byte;
      Key: Word;
    //定义两个临时变量
    begin
      Key := Keyword;//Keyword应该是其它地方定义的加解密关键字,16位
      SetLength(Result,Length(S));//设置返回串长度等于源串,给返回字符串申请空间
      for I := 1 to Length(S) do//以字符串长度为循环
      begin
        Result[I] := char(byte(S[I]) xor (Key shr 8));//返回值字符串的第I个字符,等于源字符串第I个字符的ASCII码,8位,和KEY的高8位异或运算
        Key := (byte(S[I]) + Key) * 21469+ 12347;//加密关键字等于源字符串第I位的ASCII值 ,8位,加上KEY的本来值,再乘以21469,加上12347,最后取低16位.
      end;
    end;大约就这样吧,不知道理解有没有错误.
      

  10.   

    570636898 = $22033A62,赋值给 Word 类型的 Key 时,溢出部分被忽略,取 $3A62 赋给 key ,即是 key = $3A62 = 14946 。假定 Keyword:=25630; s:='12'; 调用函数 Decrypt('12'),第一次运行到将要执行 Key:=(byte(S[I])+Key) * 21469+ 12347;句子时,式子右边是(49+26530)*21469+12347=551314798,当这句子执行完毕时,key 应该为 570636898($22033A62),但是,单步跟踪可以发现,key 的值是 14946($3A62),而这正是 $22033A62 的低十六位!我这样描述,楼主是否理解和赞同呢? 
      

  11.   

    570636898 = $22033A62,赋值给 Word 类型的 Key 时,溢出部分被忽略,取 $3A62 赋给 key ,即是 key = $3A62 = 14946 。假定 Keyword:=25630; s:='12'; 调用函数 Decrypt('12'),第一次运行到将要执行 Key:=(byte(S[I])+Key) * 21469+ 12347;句子时,式子右边是(49+26530)*21469+12347=570636898(上贴这里打错字了),当这句子执行完毕时,key 应该为 570636898($22033A62),但是,单步跟踪可以发现,key 的值是 14946($3A62),而这正是 $22033A62 的低十六位!我这样描述,楼主是否理解和赞同呢?
      

  12.   

    integer(另还有特殊^integer) -32768(-2^15) ~ 32767(2^15-1) 2  带符号16位  
    word 0 ~ 65535(2^16-1) 2 无符号16位