Seite 1 von 1

Frage zu CRC32Fingerprint PB x64

Verfasst: 24.11.2009 18:28
von Christian+
Ich habe heute mal ein kleines Projekt von 32 Bit nach 64 Bit angepasst und dabei ist mir aufgefallen, dass ich unter 64 Bit beim CRC32Fingerprint() zum Teil ein anderes Ergebnis bekomme wie unter 32 Bit weshalb meine vergleiche ob der CRC stimmt nicht mehr funktionierten. Da ich mich jetzt damit nicht ganz so gut auskenne, wollte ich jetzt mal wissen ob das einen bestimmten Grund hat, dass ich unter 64 Bit was anderes zurück bekomme wie unter 32 Bit. Ich dachte ein CRC32 ist immer 32 Bit also 4 Byte und damit ein Long wieso konvertieren dann Debug und die direkte Übergabe an einen Quad das nicht genauso wie wenn ich einen Long zum Quad mache?

Code: Alles auswählen

  *Buffer = AllocateMemory(1000)
  If *Buffer
  
    PokeS(*Buffer, "The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.") 
    Length = MemoryStringLength(*Buffer)
    
    CRC1.l = CRC32Fingerprint(*Buffer, Length)
    Debug CRC1 ;-1696003417
    
    CRC2.q = CRC1
    Debug CRC2 ;-1696003417
    
    CRC3.q = CRC32Fingerprint(*Buffer, Length)
    Debug CRC3 ;2598963879
    
    Debug CRC32Fingerprint(*Buffer, Length) ;2598963879
    
    If CRC1=CRC32Fingerprint(*Buffer, Length)
     Debug "OK"
    EndIf
  
    FreeMemory(*Buffer)
    
  EndIf
mfg Christian+

Re: Frage zu CRC32Fingerprint PB x64

Verfasst: 24.11.2009 23:33
von Thorium
CRC32 ist niemals ein Quad. Der Fehler liegt darin das bei Konvertierung von Long zu Quad das Vorzeichen beachtet wird.

Code: Alles auswählen

*Buffer = AllocateMemory(1000)
  If *Buffer
 
    PokeS(*Buffer, "The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.")
    Length = MemoryStringLength(*Buffer)
   
    CRC1.l = CRC32Fingerprint(*Buffer, Length)
    Debug CRC1 ;-1696003417
   
    CRC2.q = CRC1 & $00000000FFFFFFFF
    Debug CRC2 ;-1696003417
   
    CRC3.q = CRC32Fingerprint(*Buffer, Length)
    Debug CRC3 ;2598963879
   
    Debug CRC32Fingerprint(*Buffer, Length) ;2598963879
   
    If CRC1=CRC32Fingerprint(*Buffer, Length)
     Debug "OK"
    EndIf
 
    FreeMemory(*Buffer)
   
  EndIf
Nutze CRC32 einfach niemals als Quad, das ist generell falsch.

Re: Frage zu CRC32Fingerprint PB x64

Verfasst: 25.11.2009 15:02
von Christian+
Ich hatte auch nicht vor den CRC32 als Quad zu nutzen. Ich fand es halt seltsam, dass ein direkter Vergleich mit einen Long nicht mehr geht wie z.B:

Code: Alles auswählen

If OrginalCRC = CRC32Fingerprint(*Buffer, Length)
Eigentlich ein seltsames verhalten wenn PureBasic das Vorzeichen beim konvertieren von Long zu Quad beachtet aber nicht wenn ich einen Variable von Typ Long mit dem Rückgabewert von CRC32Fingerprint vergleiche. Werde ich den Rückgabewert eben immer erst zwischenspeichern in einer Varibale vom Typ Long dann ist das Problem gelöst.

mfg Christian+

Re: Frage zu CRC32Fingerprint PB x64

Verfasst: 25.11.2009 15:33
von Little John
Christian+ hat geschrieben:Werde ich den Rückgabewert eben immer erst zwischenspeichern in einer Varibale vom Typ Long dann ist das Problem gelöst.
Das ist nach dem was ich im Laufe der Zeit hier im Forum gelesen habe sowieso immer die sicherste Variante bei PureBasic. ;-) Z.B. auch beim Rückgabewert einer Prozedur: Es kann passieren dass

Code: Alles auswählen

ProcedureReturn <Ausdruck>
nicht wie erwartet funktioniert,

Code: Alles auswählen

temp = <Ausdruck>
ProcedureReturn temp
hingegen schon.

Gruß, Little John