質問
同じ関数を使用しました( OneWayENCRYPT(edit1.text) )Delphi 5および2010で。
なぜ結果が違うのですか? (またはどうすればDelphi 2010の結果を出すことができますか?)
uses Sysutils, Windows, Dialogs, classes;
function OneWayEncrypt(AStr: string): string;
PROCEDURE CalcCRC32 (p: pointer; ByteCount: DWORD; VAR CRCvalue: DWORD);
implementation
const
table: ARRAY[0..255] OF DWORD =
(
//table consts are here
);
PROCEDURE CalcCRC32(p: pointer; ByteCount: DWORD; VAR CRCvalue: DWORD);
VAR
i: DWORD;
q: ^Byte;
BEGIN
q := p;
FOR i := 0 TO ByteCount - 1 DO
BEGIN
CRCvalue := (CRCvalue SHR 8) XOR table[q^ XOR (CRCvalue AND $000000FF)];
INC(q);
END
END;
function OneWayEncrypt(AStr: string): string;
var
dwCrc: DWORD;
s: string;
begin
dwCrc := $FFFFFFFF;
s := 'X' + AStr + '7F';
CalcCRC32(Addr(s[1]), Length(s), dwCrc);
result := IntToHex(dwCrc, 8);
end;
解決
あなたはそれを知っていますか? string
D2010のUnicode文字列を指しますが、バージョン<D2009のAnsistringを指します。それがあなたの問題の原因であるべきです。
したがって、2つの選択肢があります。
- すべての外観を交換できます
string
とAnsiString
. 。これにより、もちろんUnicodeサポートなしで、D5と同じ結果が得られるはずです - コードをリファクタリングできます。ここでは、ポインター「ハッキング」が重要な部分だと思います。しかし、私は認めなければなりません、私はコードを完全に理解するために時間をかけませんでした;-)(255 consts = ISO8859のために、とにかくあなたのコードをUnicodeで使用できないことが非常によくありますか?)
他のヒント
D2010(およびD2009)は、Unicode文字列(幅広)を使用するため、文字サイズは異なります(バイト)。文字列のすべての参照をAnsistringに切り替えてみてください。
最小限のポート、1行の変更:
// old code:
CalcCRC32(Addr(s[1]), Length(s), dwCrc);
// delphi 2010 code:
CalcCRC32( PAnsiChar(AnsiString(s)), Length(s), dwCrc);
Unicode「文字列」のユニコードコンテンツは失われることに注意してください。ただし、以前に使用したANSI(AZ、1,3,4、ご存知のとおり)、たとえば「Hello」などは、前と同じように機能するはずです。これはCRC32アルゴリズムであるため、文字列のUTF8エンコードでCRC32を簡単に実行できます。
所属していません StackOverflow