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?
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.
tomycat - Do 04.05.23 10:58
hallo,
ich steige da nicht ganz durch.
C#-Quelltext
1: 2:
| byte[] d = { 0x11, 0x22, 0x33 }; 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
tomycat hat folgendes geschrieben : |
Was muss ich ändern, dass ich eine crc32 |
CRC32 sieht z.B. so aus:
04C11DB7 (also so wie du es oben schon hattest)
tomycat hat folgendes geschrieben : |
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 = { 0x11, 0x22, 0x22, 0x22, 0xf2 }; 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 = { 0x11, 0x22, 0x22, 0x22, 0xf2 }; 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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2024 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!