Delphi 5 до 2010 - PullRequest
       13

Delphi 5 до 2010

2 голосов
/ 22 марта 2010

Я использовал ту же функцию ( 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;

Ответы [ 3 ]

10 голосов
/ 22 марта 2010

Знаете ли вы, что string относится к строке Unicode в D2010, в то время как к версии AnsiString в версиях

Итак, у вас есть два варианта:

  • Вы можете заменить все виды string на AnsiString. Это должно дать вам те же результаты, что и в D5, конечно, без поддержки Unicode
  • Вы можете изменить свой код. Я думаю, что указатель - «взлом» является ключевой частью здесь. Но я должен признать, я не нашел времени, чтобы полностью понять код ;-) (Вполне может быть, что ваш код в любом случае не может быть использован с Unicode из-за 255 констант = ISO8859?)
4 голосов
/ 22 марта 2010

D2010 (и D2009) используют строки Unicode (самые широкие), поэтому размер символов различен (в байтах). Попробуйте переключить все ссылки на строку на AnsiString.

3 голосов
/ 22 марта 2010

Минимальный порт, смена одной строки:

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

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

Имейте в виду, что любое содержимое Unicode в Unicode "String" будет потеряно, но любой ANSI (AZ, 1,3,4, вы знаете) кодовые точки, которые вы использовали ранее, например «Hello», должны работать так же, как и раньше.Поскольку это алгоритм CRC32, он также может легко выполнить CRC32 для кодировки строки в кодировке UTF8.

...