我使用了相同的功能( 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?那应该是您问题的根源。

因此,您有两个选择:

  • 您可以替换所有外观 stringAnsiString. 。当然,这应该给您与D5中相同的结果,而没有Unicode支持
  • 您可以重构代码。我猜指针 - “黑客”是这里的关键部分。但是我不得不承认,我没有花时间完全理解代码;-)(很可能是因为255 consts = iso8859,无论如何您的代码都不能与Unicode一起使用?)

其他提示

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

最小端口,一行更改:

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

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

请注意,Unicode“字符串”中的任何Unicode内容都会丢失,但是您以前使用过的任何ANSI(AZ,1,3,4,您知道)CodePoint,例如“ Hello”,都应该像以前一样工作。由于这是CRC32算法,因此它也可以在字符串编码的UTF8上进行CRC32。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top