Entwickler-Ecke

Basistechnologien - CRC32 per c# berechnen...


tomycat - Mi 03.05.23 12:42
Titel: CRC32 per c# berechnen...
hallo,
ich habe ...

0x11 0x22 0x33 0x44

Davon ich will eine Checksum berechnen.
ich habe viele mini Projekte über google durchprobiert.
Die einen wollen dass ich eine exe Datei anhänge, bei den anderen habe ich eine lange hex Zahl als checksum.
Ich will aber nur eine 2 Stellige Zahl.
Gibts da nicht eine einfache Funktion?


Ralf Jansen - Mi 03.05.23 13:04

Hier https://rosettacode.org/wiki/CRC-32#C#
wäre schonmal eine Implementierung an der du dich orientieren kannst.


tomycat - Mi 03.05.23 13:11

aber bekomme ich bekomme folgende Zahl heraus...laut wiki

Output:

414fa339

diese sollte aber nur 2 Stellen haben


Ralf Jansen - Mi 03.05.23 13:17

Dann ist es kein CRC32 wenn es am Ende nur 2 Stellen sein sollen.

Wenn du nur irgendeine Prüfziffer möchtest mußt du genauer definieren was die genau leisten soll (was für Fehler sollen erkannt werden) dann kann man was empfehlen oder eine Beispielimplementierung zeigen.


Th69 - Mi 03.05.23 13:27

Wenn du mit 2 Stellen 1 Byte meinst, dann kannst du auch einfach (bitweises) Logischer exklusiver OR-Operator: ^ [https://learn.microsoft.com/de-de/dotnet/csharp/language-reference/operators/bitwise-and-shift-operators#logical-exclusive-or-operator-] benutzen.


tomycat - Do 04.05.23 10:58

hallo,

ich steige da nicht ganz durch.

C#-Quelltext
1:
2:
byte[] d = { 0x110x220x33  };
Console.WriteLine(Convert.ToString(d[0] | d[1], toBase: 2));

Ausgabe:
110011

Was muss ich ändern, dass ich eine crc32 hex habe?


jaenicke - Do 04.05.23 11:26

user profile icontomycat hat folgendes geschrieben Zum zitierten Posting springen:
Was muss ich ändern, dass ich eine crc32
CRC32 sieht z.B. so aus:
04C11DB7 (also so wie du es oben schon hattest)

user profile icontomycat hat folgendes geschrieben Zum zitierten Posting springen:
hex habe?
Welche Basis hat Hexadezimal noch einmal? Richtig: 16 und nicht 2...


Ralf Jansen - Do 04.05.23 12:14

Eine CRC32 Checksumme ist per Definition 4Byte du sprichst aber von 2 Stelliger Zahl
Das passt nicht. Da du Hex Zahlen zeigst gehe ich davon aus das du auch einen 2stelligen Hex Output willst also irgendwas zwischen 00 und FF und das ist genau 1Byte.

Also nochmal was willst du genau
- CRC32? Dann bekommst du immer 4Byte Checksummen
- 2 Hex Stellen? Dann brauchst du ein Verfahren das 1Byte liefert. Du versucht hier Bytes mit ODER zu verknüpfen das führt das du mit steigender Zahl von Bytes eine Prüfsumme billdest die immer nur größer wird und du immer bei FF landest. Das ist eher ungeeignet als Checksumme jemand oben hat EXCLUSIV ODER empfohlen das macht schon etwas mehr Sinn. Dafür mußt du aber nicht | sondern ^ verwenden. Und ja du willst base 16 nicht base 2.


Um dir eine sinnvolle 1Byte Checksumme zu empfehlen müßen wir wissen wofür du den benutzen willst. Für verschiedene Anwendungsfälle eigenen sich verschiedene Methoden. Das hier genannte EXCLUSIV ODER ist halbwegs nutzbar für eine technische Datenübertragung aber z.B. für eine menschliche Eingabe eher schwach da diese Prüfsumme Vertauschung von Zeichen nicht sicher erkennt. Das ist ein sehr menschlicher Fehler aber keiner den einen technischen System macht da passieren andere Fehler. Drum nutz man halt je Anwendungsfall andere Checksummen Verfahren.


tomycat - Do 04.05.23 17:00

Stimmt stimmt stimmt !!!
CRC hat 4 Byte, da war was.

Ihr habt recht, 1 Byte meine ich. :-)

Denke ich so richtig:

C#-Quelltext
1:
2:
   byte[] meintest = { 0x110x220x220x220xf2 };
   Console.WriteLine(0x11 ^ 0x22 ^ 0x22 ^ 0x22 ^ 0xf2);


Wie erstelle ich eine Prüfsumme einfacher? z.b. For schleife oder geht das einfacher?


jaenicke - Do 04.05.23 18:28

Ich kann es gerade nicht testen, aber das sollte gehen:

C#-Quelltext
1:
UInt32 checksum = d.Aggregate((a, b) => a ^ b);                    


Ralf Jansen - Do 04.05.23 19:27

Fast wir wollten ja ein byte. An der Stelle muß man da leider casten. Die Operatoren wie ^ sind leider erst ab int Implementiert.


C#-Quelltext
1:
2:
byte[] meintest = { 0x110x220x220x220xf2 };
byte checksum = meintest.Aggregate((a, b) => (byte)(a ^ b));


Sollte dein Compiler meckern das er Aggregate nicht kennt dann fehlt dir am Anfang deiner Datei ein.


C#-Quelltext
1:
using System.Linq;