Frage zu CRC32Fingerprint PB x64

Anfängerfragen zum Programmieren mit PureBasic.
Christian+
Beiträge: 213
Registriert: 13.07.2008 10:05
Computerausstattung: Windows 8.1 Pro
AMD Phenom II X4 955 @ 3.2 GHz
4GB RAM
NVIDIA GeForce GTX 660

Frage zu CRC32Fingerprint PB x64

Beitrag 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+
Windows 8.1 Pro 64Bit | AMD Phenom II X4 955 @ 3.2 GHz | 4GB RAM | NVIDIA GeForce GTX 660
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Re: Frage zu CRC32Fingerprint PB x64

Beitrag 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.
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Christian+
Beiträge: 213
Registriert: 13.07.2008 10:05
Computerausstattung: Windows 8.1 Pro
AMD Phenom II X4 955 @ 3.2 GHz
4GB RAM
NVIDIA GeForce GTX 660

Re: Frage zu CRC32Fingerprint PB x64

Beitrag 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+
Windows 8.1 Pro 64Bit | AMD Phenom II X4 955 @ 3.2 GHz | 4GB RAM | NVIDIA GeForce GTX 660
Little John

Re: Frage zu CRC32Fingerprint PB x64

Beitrag 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
Antworten