2010-03-22 118 views
2

我在Delphi 5和2010中使用了相同的函數(OneWayEncrypt(edit1.Text))。
爲什麼結果不同? (或者我怎麼可以給從2010年德爾福?同樣的結果)Delphi 5 to 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; 
+2

這是一個加密函數嗎?這是一個有損散列函數,使用CRC32來計算非常弱的散列。 – 2010-03-22 17:02:46

+0

有趣的一點:當你運行這個代碼時,OneWayEncrypt的結果是一個八位數值,其中最重要的四位數字都是零?因爲當我在這裏運行這個代碼時,使用一些我自己爲上面的常量創建的表,它們是DWORD的大小,出於某種原因,我得到了這個結果。 – 2010-03-22 17:29:19

回答

10

您是否知道string引用了D2010中的Unicode字符串,而它是指版本< D2009中的AnsiString?這應該是你問題的根源。

所以,你有兩個選擇:

  • 您可以用AnsiString取代的string悉數亮相。這應該會給你與D5相同的結果,當然沒有Unicode支持
  • 你可以重構你的代碼。我猜測指針 - 「黑客」是這裏的關鍵部分。但我不得不承認,我沒有花時間去完全理解代碼;-) (很可能是因爲255 consts = ISO8859,你的代碼不能用於Unicode)
+0

。在EMbarcadero/Codegear Developers Network網站上閱讀Nick Hodge的「Unicode世界中的Delphi」論文。 – 2010-03-22 17:00:20

4

D2010(D2009和)使用Unicode字符串(widestrings),所以字符大小是不同的(字節)。嘗試將所有字符串引用切換到AnsiString。

+0

和Char到AnsiChar,PChar到PAnsichar。除了盲目搜索和替換而不知道自己在做什麼在某些地方(比如說10%)是錯誤的,並且在其他地方(比如說90%)是錯誤的。所以你必須做一些思考,學習,做出明智的決定,而不是盲目地應用規則,向上移植。 – 2010-03-22 17:01:30

+0

在這個傢伙的情況下,這將是一步,前進兩步。正確地看到我的回答 – 2010-03-22 17:17:03

3

最小端口,1個線路變化:

// 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,你就知道)之前使用的代碼點,例如「Hello」,應該像以前一樣工作。由於這是一種CRC32算法,因此它可以很容易地對字符串的UTF8編碼做一個CRC32。