2016-04-15 139 views
1

下面的功能是用Delphi编写的2007年函数返回不同的结果

function TMainFrm.DecodePsw(Passw : String) : String; 
var 
    i : Integer; 
    ss : String; 
Begin 
    ss := Passw; 
    for i:=1 to Length(ss) do begin 
    ss[i] := Chr(Ord(ss[i]) - i*21 + 15); 
    end;  
    Result := ss; 
end; 

在某些客户端计算机返回用相同的输入数据的不同结果的遗留应用程序的基本解密程序,可能是什么可能的原因是什么?

回答

3

的问题,一种设想是,该把一个字符串,好像它是一个字节数组。但字符串的值也取决于假定的编码。而且由于您使用的是ANSI字符串,因此您的字节数组将被解释为它们在任何主流语言环境中都被编码。因此,相同的字节数组在Windows 1252语言环境中以单向方式解释,在Windows 1251语言环境中以另一种方式解释,等等。

这就是为什么你的代码具有不同的行为在不同的机器。确切地说,你如何解决你的问题我不能用有限的信息来说明。我想说,你在这里所做的并不是我所说的加密,但我想你知道这一点。我还建议解密密码是不寻常的。这被认为是不好的做法。

+0

我怀疑的语言环境中寻找Windows设置我只能找到地区下系统区域设置一个含糊的提法之后然而 - >管理 - >更改系统区域设置...我比较了这些设置到另一台计算机是工作在同一网站上它是一样的。 您特别提到在上面的回答ANSI字符串,因为德尔福2007年的,这是否意味着这不会是Unicode的一个问题? –

+0

你确定吗?这是Delphi 2007和Chr/Ord只是简单的强制转换。 2007年没有字符串区域设置的概念。 – gabr

+2

@gabr作为字节数组是真的。但正如屏幕上显示的文字所说,区域设置很重要 –