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

您是否知道它string指的是 D2010 中的 Unicode 字符串,而它指的是版本 < D2009 中的 AnsiString?那应该是你问题的根源。

所以你有两个选择:

  • string您可以用替换所有外观AnsiString。这应该会给你与 D5 相同的结果,当然没有 Unicode 支持
  • 你可以重构你的代码。我想指针“黑客”是这里的关键部分。但我必须承认,我没有花时间完全理解代码 ;-)(很可能你的代码无论如何都不能与 Unicode 一起使用,因为 255 consts = ISO8859?)
于 2010-03-22T12:12:12.457 回答
4

D2010(和 D2009)使用 Unicode 字符串(widestrings),因此字符大小不同(字节)。尝试将字符串的所有引用切换到 AnsiString。

于 2010-03-22T12:11:46.420 回答
3

最小端口,一换行:

  // 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 回答