德尔福5至2010年

Sim*_*aWB 2 delphi crc delphi-2010

我在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;
Run Code Online (Sandbox Code Playgroud)

Leo*_*Leo 10

您是否知道string在D2010 中引用了一个Unicode字符串,而它在版本<D2009中引用了AnsiString?那应该是你问题的根源.

所以你有两个选择:

  • 您可以取代所有出场stringAnsiString.这应该会给你与D5相同的结果,当然没有Unicode支持
  • 你可以重构你的代码.我想指针 - "黑客"是这里的关键部分.但我不得不承认,我没有花时间完全理解代码;-)(很可能你的代码不能用于Unicode,因为255 consts = ISO8859?)