質問

同じ関数を使用しました( 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つの選択肢があります。

  • すべての外観を交換できます stringAnsiString. 。これにより、もちろん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を簡単に実行できます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top