Hi,
ich wollte mal den kleinen Code hier (http://de.wikipedia.org/wiki/Zyklische_Redundanzpr%C3%BCfung#Berechnung_einer_CRC-32-Pr.C3.BCfsumme_in_C) in C# umsetzen.
Doch irgendwie liefert er mir andauernd einen falschen CRC-Wert.
Sieht jemand den Fehler?
Das zu übergebende uint-Array stellt eine Folge von Bits dar.
class CRC
{
//Dies entspricht dem CRC-32-Generator-Polynom
uint Poly = 0x04C11DB7;
public uint CRC32(uint[] message)
{
uint crc32 = 0;
for (int i = 0; i < message.Length; i++ )
{
uint hbit = ((crc32 & 0x80000000) == 0x10000000) ? (uint)1 : (uint)0;
if (hbit != message[i])
crc32 = (crc32 << 1) ^ Poly;
else
crc32 = crc32 << 1;
}
return crc32;
}
}
Gruss
el_MKay
Dumm ist der, der dummes tut.
Hallo,
dein hbit wird nicht richtig gesetzt, da (crc32 & 0x80000000) nie den Wert 0x10000000
annehmen kann.
Ansonsten, (afaik), enhält C# bereits eine Funktion um den CRC32 Wert zu berechnen.
Hi, danke für die Antwort.
In dem Wikipedia-Source steht ja nur
hbit=(crc32 & 0x80000000) ? 1 : 0;
Wie setze ich das in C# um?
Dumm ist der, der dummes tut.
Hallo,
hbit = (( crc32 & 0x80000000 ) == crc32 ) ? 1 : 0;
Grüsse,
Egon
egrath's Blog: http://egonrath.eg.funpic.de/wordpress
hm, damit erhalte ich aber auch noch einen falschen CRC.
Dumm ist der, der dummes tut.
Hallo el_MKay,
hm, damit erhalte ich aber auch noch einen falschen CRC.
richtug, aber man kann sich leicht überlegen, wie man egraths Code ändern muss:
hbit = (( crc32 & 0x80000000 ) == 0x80000000 ) ? 1 : 0;
herbivore
Auch damit komme ich nicht auf den gewollten CRC :X
Könnte es damit zusammenhängen, dass ich uints benutze?
Dumm ist der, der dummes tut.
Hallo,
falls es der OP noch nicht hinbekommen hat, hier eine Conversion des auf Wikipedia zu findenden Algorithmusses für die Berechnung eines CRC32 für ein Byte-Array:
using System;
namespace egrath.test.crc32
{
public class Crc32Test
{
private static UInt32 CalculateCrc32( byte[] data )
{
UInt32 polynom = 0x04C11DB7;
UInt32 crc32 = 0;
for( int index = 0; index < data.Length; index ++ )
{
int hbit = 0;
hbit = (( crc32 & 0x80000000 ) == 0x80000000 ) ? 1 : 0;
if( hbit != data[index] )
{
crc32 = ( crc32 << 1 ) ^ polynom;
}
else
{
crc32 = crc32 << 1;
}
}
return crc32;
}
public static void Main( string[] args )
{
Console.Out.WriteLine( "0x{0:X}", CalculateCrc32( new byte[] { 1, 0, 0, 0, 1, 1, 0, 0 } ));
}
}
}
Grüsse,
Egon
egrath's Blog: http://egonrath.eg.funpic.de/wordpress
Irgendwas haut da nicht hin.
Wenn ich ihn mit einem "new byte[] { 1, 1, 0, 0, 0, 0 }" bestücke, liefert ert als Ergebnis 3560074640 (dezimal). Da müsste meiner Meinung nach was mit 410... rauskommen.
Dumm ist der, der dummes tut.
Hallo,
ich habe mich noch nie intensiver mit der CRC32 Funktion beschäftigt, aber bei mir kommt mit einer Bytefolge von 0x010100000000 eine Prüfsumme von 0xD4326D90 heraus. Das gleiche ergebnis wie mit der Referenzimplementierung auf wikipedia. Habe auch noch etliche andere Prüfsummen für andere Eingabedaten versucht und die Ergebnisse stimmen überein....
Eventuell passt am Referenzcode was nicht?
Grüsse,
Egon
egrath's Blog: http://egonrath.eg.funpic.de/wordpress