题
我使用了相同的功能( 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?那应该是您问题的根源。
因此,您有两个选择:
- 您可以替换所有外观
string
和AnsiString
. 。当然,这应该给您与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。
不隶属于 StackOverflow