2

Delphi 5 と 2010 で同じ関数 ( OneWayEncrypt(edit1.Text)
) を使用しました。 結果が異なるのはなぜですか? (または、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;
4

3 に答える 3

10

D2010 では Unicode 文字列をstring参照し、D2009 より前のバージョンでは AnsiString を参照していることをご存知ですか? それがあなたの問題の原因であるはずです。

したがって、次の 2 つの選択肢があります。

  • stringのすべての外観をに置き換えることができますAnsiString。これにより、もちろん Unicode サポートなしで、D5 と同じ結果が得られるはずです。
  • コードをリファクタリングできます。ここでは、ポインター「ハッキング」が重要な部分だと思います。しかし、私はコードを完全に理解するのに時間をかけなかったことを認めなければなりません;-) (255 consts = ISO8859 のため、あなたのコードはとにかく Unicode で使用できない可能性が非常に高いですか?)
于 2010-03-22T12:12:12.457 に答える
4

D2010 (および D2009) は Unicode 文字列 (ワイド文字列) を使用するため、文字サイズ (バイト) が異なります。文字列のすべての参照を AnsiString に切り替えてみてください。

于 2010-03-22T12:11:46.420 に答える
3

最小限のポート、1 行の変更:

  // old code:
  CalcCRC32(Addr(s[1]), Length(s), dwCrc);

  // delphi 2010 code:
  CalcCRC32( PAnsiChar(AnsiString(s)), Length(s), dwCrc);

Unicode "String" の Unicode コンテンツはすべて失われることに注意してください。ただし、以前に使用した ANSI (AZ、1、3、4) コードポイント ("Hello" など) は以前と同じように機能するはずです。これは CRC32 アルゴリズムであるため、文字列の UTF8 エンコーディングでも CRC32 を簡単に実行できます。

于 2010-03-22T17:05:31.583 に答える