Laden...

CRC32 - Kurzform

Erstellt von el_MKay vor 16 Jahren Letzter Beitrag vor 16 Jahren 4.048 Views
E
el_MKay Themenstarter:in
79 Beiträge seit 2006
vor 16 Jahren
CRC32 - Kurzform

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.

A
138 Beiträge seit 2007
vor 16 Jahren

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.

E
el_MKay Themenstarter:in
79 Beiträge seit 2006
vor 16 Jahren

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.

871 Beiträge seit 2005
vor 16 Jahren

Hallo,


hbit = (( crc32 & 0x80000000 ) == crc32 ) ? 1 : 0;

Grüsse,
Egon

E
el_MKay Themenstarter:in
79 Beiträge seit 2006
vor 16 Jahren

hm, damit erhalte ich aber auch noch einen falschen CRC.

Dumm ist der, der dummes tut.

49.485 Beiträge seit 2005
vor 16 Jahren

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

E
el_MKay Themenstarter:in
79 Beiträge seit 2006
vor 16 Jahren

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.

871 Beiträge seit 2005
vor 16 Jahren

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

E
el_MKay Themenstarter:in
79 Beiträge seit 2006
vor 16 Jahren

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.

871 Beiträge seit 2005
vor 16 Jahren

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