Autor Beitrag
tomycat
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 265
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 265
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 265
Erhaltene Danke: 1



BeitragVerfasst: Do 04.05.23 10:58 
hallo,

ich steige da nicht ganz durch.
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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...

Für diesen Beitrag haben gedankt: tomycat
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 265
Erhaltene Danke: 1



BeitragVerfasst: 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 04.05.23 18:28 
Ich kann es gerade nicht testen, aber das sollte gehen:
ausblenden C#-Quelltext
1:
UInt32 checksum = d.Aggregate((a, b) => a ^ b);					
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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.

ausblenden 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.

ausblenden C#-Quelltext
1:
using System.Linq;					

Für diesen Beitrag haben gedankt: tomycat