PHP crc32 <> BM crc32 ?

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

Phalastos

Betreff: PHP crc32 <> BM crc32 ?

BeitragMo, Jul 11, 2005 16:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Blitzer,

ich habe ein nerviges Problem mit crc32 Checksummen.
Trotz identischer Dateien, werden unterschiedliche Checksummen erzeugt.

In PHP erstelle ich die Checksumme einer Datei so :

$crc32_checksum = crc32(file_get_contents($testdatei));

Ergebnis : -355164357

--------

In BM erstelle ich die Checksumme einer Datei so :


Code: [AUSKLAPPEN]

Function crc_file(name$)

  Local bbyte
  Local crc:Int
  Local file:TStream

  crc=$FFFFFFFF
  file=ReadFile(name$)
  If file=Null Then Return
 
  While Not Eof(file)
    bbyte=ReadByte(file)
    crc=(crc Shr 8) ~ crc_table[bbyte ~ (crc & $FF)]
  Wend
 
  CloseFile file
 
  Return ~crc

End Function

local_crc32 = crc_file("testdatei")



Ergebnis : -1609018479


Wie kommt es zu diesen Unterschieden bei ein und der selben Datei?

Gruß

Alex
Forbiddenmagic - Warfare of Forgotten Power
 

Dreamora

BeitragMo, Jul 11, 2005 17:23
Antworten mit Zitat
Benutzer-Profile anzeigen
definier bbyte mal als :BYTE, vielleicht hilft das, da die Operationen unterschiedlich laufen zwischen :Byte und :int
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Phalastos

BeitragMo, Jul 11, 2005 17:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi Dreamora,

hat leider nichts geholfen.
Forbiddenmagic - Warfare of Forgotten Power

TheShadow

Moderator

BeitragMo, Jul 11, 2005 17:38
Antworten mit Zitat
Benutzer-Profile anzeigen
wenn schon, dann sollte man kompletten code zeigen. Hier Code für BB-classic:

Code: [AUSKLAPPEN]

Dim crc_table(255)
crc_init()

;---------------------------------------------------------------------
Function crc_init()
  Local i
  Local j
  Local value

  For i=0 To 255
    value=i
    For j=0 To 7
      If (value And $1) Then
        value=(value Shr 1) Xor $EDB88320
      Else
        value=(value Shr 1)
      EndIf
    Next
    crc_table(i)=value
  Next
End Function

;---------------------------------------------------------------------
Function crc_file(name$)
  Local byte
  Local crc
  Local file

  crc=$FFFFFFFF
  file=ReadFile(name$)
  If file=0 Then Return
  While Not Eof(file)
    byte=ReadByte(file)
    crc=(crc Shr 8) Xor crc_table(byte Xor (crc And $FF))
  Wend
  Return ~crc
End Function



Dieser Code funktioniert im Pronzip genau umgekehrt wie andere Algorithmen die im Internet zu finden sind - dafür ist es schneller und einfacher...
AMD64 3500+ | GeForce6600GT 128MB | 1GB DDR | WinXPsp2
 

Dreamora

BeitragMo, Jul 11, 2005 17:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich versteh zwar nicht soooviel von dieser CRC berechnung, deshalb die folgendes ohne Gewähr:

- gemäss http://www.vbaccelerator.com/h...rticle.asp ist da in deiner crc berechnung ein Fehler und zwar wird die Bytereihenfolge nicht invertiert am Schluss ...

- gemäss der Page müsste dein crc überdies :Long und nicht :int sein ... Ob das einen Einfluss hat, weiss ich nicht ... (dadurch auch der function return type von nix auf :long)
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Phalastos

BeitragMo, Jul 11, 2005 18:03
Antworten mit Zitat
Benutzer-Profile anzeigen
@TheShadow

Der Code war nicht von Dir, sondern aus dem englischen Forum. Aber wenn ich den jetzt mal mit Deinem vergleiche, kann ich mir denken wer ihn zuerst geschrieben hat. Very Happy

Würde es reichen die Checksumme zu invertieren um kompatibel zum PHP crc32() zu werden?

@Dreamora

Danke Dir, so etwas habe ich gesucht.
Hast Du noch nen Tip zum Invertieren auf der Kante?

Gruß

Alex
Forbiddenmagic - Warfare of Forgotten Power
 

Dreamora

BeitragMo, Jul 11, 2005 19:03
Antworten mit Zitat
Benutzer-Profile anzeigen
crc = ~ crc ? Wink

~ unary = not
~ binary = xor Smile
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

Black

BeitragMo, Jul 11, 2005 19:19
Antworten mit Zitat
Benutzer-Profile anzeigen
In BMax ist long 64bit groß und int 32bit, also passt int für CRC32.

Phalastos

BeitragMo, Jul 11, 2005 19:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Nur kommt immer noch ne andere Checksumme raus als bei crc32() in PHP. Sad

Also ich habe mir jetzt nochmal ein drittes Programm angeschaut.
Der Ergebnis ist , daß die BM Checksum stimmt.

Der Fehler liegt also in der PHP Anweisung.

Edit2 : Nun habe ich zwar eine PHP Function welche die selben Prüfsummen liefert, doch reicht nun die Ausführzeit des PHP Scripts nicht mehr aus. Sad
Forbiddenmagic - Warfare of Forgotten Power

Markus2

BeitragDi, Jul 12, 2005 12:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Vieleicht hilft das ?

Because PHP's integer type is signed, and many crc32 checksums will result in negative integers, you need to use the "%u" formatter of sprintf() or printf() to get the string representation of the unsigned crc32 checksum.

Phalastos

BeitragDi, Jul 12, 2005 18:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke Dir Markus,

aber das hilft leider auch nichts.
Wenn ich in PHP die crc32 checksum mit einer eigenen Funktion erstellen lasse, sprich nicht crc32() benutze, dann wird die richtige Checksumme berechnet. Leider sprengt das Script dann bei mehreren Dateien die Ausführungszeit welche PHP dem Script einräumt.

Ich könnte freilich die Script soweit erweitern, daß es nur immer für eine Datei eine checksum erstellt und sich dann wieder selbst aufruft.
Aber vieleicht gibt es noch einen feinere Lösung...

Gruß

Alex
Forbiddenmagic - Warfare of Forgotten Power

Markus2

BeitragDi, Jul 12, 2005 18:59
Antworten mit Zitat
Benutzer-Profile anzeigen
@Phalastos

Haste mal nen Beispiel String mit Checksumme dazu ? (BMax)
Ich habe auch ein Programm in VB6 was zu Dateien Checksummen macht .
Die Berechnung geht über vorcompilierten Assembler Code 8)

TheShadow

Moderator

BeitragDi, Jul 12, 2005 19:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
gemäss http://www.vbaccelerator.com/h...rticle.asp ist da in deiner crc berechnung ein Fehler und zwar wird die Bytereihenfolge nicht invertiert am Schluss ...


Ja meine Rountine arbeitet auch wie gesagt anders - hier ist alles etwas Umgekehrt. Berechnungen konnten dadurch vereinfacht werden, weshalb es schnelelr ist... Ich hab es mal im Internet gefunden... Hab es früher mal getestet und es hat funktioniert...
AMD64 3500+ | GeForce6600GT 128MB | 1GB DDR | WinXPsp2

Phalastos

BeitragMi, Jul 13, 2005 17:13
Antworten mit Zitat
Benutzer-Profile anzeigen
So,

nochmal ein Endbericht von mir.
Ich habe alles nun auf md5 Prüfsummen umgestellt.
Damit klappt dann alles wie gewünscht.
Dennoch vielen Dank an alle Poster.

Gruß

Alex
Forbiddenmagic - Warfare of Forgotten Power

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group