2016-04-15 135 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作爲字節數組是真的。但正如屏幕上顯示的文字所說,區域設置很重要 –