Autor |
Beitrag |
tomycat
Beiträge: 265
Erhaltene Danke: 1
|
Verfasst: Mi 03.05.23 12:42
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
Beiträge: 4705
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Mi 03.05.23 13:04
Hier rosettacode.org/wiki/CRC-32#C#
wäre schonmal eine Implementierung an der du dich orientieren kannst.
Für diesen Beitrag haben gedankt: tomycat
|
|
tomycat
Beiträge: 265
Erhaltene Danke: 1
|
Verfasst: 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
Beiträge: 4705
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: 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.
Für diesen Beitrag haben gedankt: tomycat
|
|
Th69
Beiträge: 4785
Erhaltene Danke: 1055
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Mi 03.05.23 13:27
Wenn du mit 2 Stellen 1 Byte meinst, dann kannst du auch einfach (bitweises) Logischer exklusiver OR-Operator: ^ benutzen.
Für diesen Beitrag haben gedankt: tomycat
|
|
tomycat
Beiträge: 265
Erhaltene Danke: 1
|
Verfasst: 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
Beiträge: 19285
Erhaltene Danke: 1743
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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...
Für diesen Beitrag haben gedankt: tomycat
|
|
Ralf Jansen
Beiträge: 4705
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: 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.
Für diesen Beitrag haben gedankt: tomycat
|
|
tomycat
Beiträge: 265
Erhaltene Danke: 1
|
Verfasst: 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
Beiträge: 19285
Erhaltene Danke: 1743
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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
Beiträge: 4705
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Do 04.05.23 19:27
Für diesen Beitrag haben gedankt: tomycat
|
|