2016-04-15 13 views
1

以下の機能がどのように可能性があり、それは同じ入力データと異なる結果を返しますデルファイ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文字列を特に言及していますが、これはDelphi 2007のためにUnicodeで問題にならないということですか? –

+0

本当ですか?これはDelphi 2007で、Chr/Ordは単純なキャストです。 2007年には文字列ロケールという概念はなかった。 – gabr

+2

@gabrが真であるバイト配列です。しかし、画面上に表示されるテキストのように、ロケールの問題 –

関連する問題