PHP crc32 <> BM crc32 ?
Übersicht

![]() |
PhalastosBetreff: PHP crc32 <> BM crc32 ? |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi Dreamora,
hat leider nichts geholfen. |
||
Forbiddenmagic - Warfare of Forgotten Power |
![]() |
TheShadowModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@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. ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
crc = ~ crc ? ![]() ~ unary = not ~ binary = xor ![]() |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
Black |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
In BMax ist long 64bit groß und int 32bit, also passt int für CRC32. | ||
![]() |
Phalastos |
![]() Antworten mit Zitat ![]() |
---|---|---|
Nur kommt immer noch ne andere Checksumme raus als bei crc32() in PHP. ![]() 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. ![]() |
||
Forbiddenmagic - Warfare of Forgotten Power |
![]() |
Markus2 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@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) |
||
![]() |
TheShadowModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group