Checksumme berechnen

CDX

Level-2
Beiträge
13
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo allerseits.

Ich muss für eine RS232 Komunikation zwischen einer 313C-2 PtP und einem externen Gerät eine Checksumme berechnen. Der Code dafür ist bereits fertig und einfach aufgebaut, es sind nur sehr wenige Codezeilen.

Verwendet wird ein Pointer *, welcher auf eine Variablen Struktur zeigt. Der Adressbereich wird mittels crc+ aufsummiert und am Ende einer Int Variable zugewiesen. Diesen Zahlenwert sehe ich online. Ich will besser verstehen, welchen Zweck dieses Rechnen und Vergleichen hat.

Müssen die Checksummen von Source und Ziel gleich sein?

Wie, also um welchen Wert, ändert sich die Checksumme, wenn ich ein Array of String hinzufüge?

Gruß
 
Wie, also um welchen Wert, ändert sich die Checksumme, wenn ich ein Array of String hinzufüge?
Der Code dafür ist bereits fertig und einfach aufgebaut, es sind nur sehr wenige Codezeilen.
Wenn du den Code vorliegen hast und dieser sehr einfach ist, dann solltest du dies doch selber herausfinden können.

Wie soll man antworten, ohne den Code zu kennen?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Es geht um den Adressbereich : der Pointer zeigt auf ein ArrayStr[20]. Meine Checksumme ändert sich um 150. Ich versuche die Frage anders zu formulieren....

Was bedeutet es, wenn auf den Adressbereich gezeigt wird? Ist es bspw bei einem Int der Wert 32? Für 32 Bit. Falls das so sein sollte, wie ist es dann bei dem Typ String?

Der Code:

Adressbereich = *Variable1

For i = Schleife bis max Wert

Datensumme = Adressbereich + i
Crc+ = int(Datensumme)

Aus dem Gedächtnis geschrieben
 
Zuletzt bearbeitet:
Es wird der Wert der Bytes (also deren Inhalt) aufsummiert.
32 wäre in dem Fall der Wert, den ein Leerzeichen in einem String hat (das nennt sich auch ASCII-Code - vielleicht googlest du das mal).
 
...

Müssen die Checksummen von Source und Ziel gleich sein?

...
Genau das ist doch der Sinn einer Checksumme.

Zur sinnvollen Berechnung einer Checksumme benötigt man (auf beiden Seiten) einen Algorithmus, mit dem Abweichungen zuverlässig erkannt werden.

Bei der einfachsten Variante – die Berechnung der Quersumme – würden etwa einfach Zahlendreher nicht erkannt.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Verstehe.... Wie ist es, wenn man mit Hilfe der Checksumme ein Datenupdate machen will? In diesem Fall gibt es zwei Strukturen Source und Destination. Die Werte darin sind unterschiedlich, ich habe alte Werte und neue. Das würde bedeuten, dass die Checksumme unterschiedlich ist, bevor ich das Update durchführe.

Geht das mit dem obigen Code, der Quersumme oder macht das keinen Sinn, eben weil die Checksumme unterschiedlich ist?

Es würde Sinn machen, wenn man die Struktur prüft, also ob es die Reihenfolge Int, Int, Real Bool ist (beispielsweise). Ist das mit der Quersumme realisierbar?
 
Wie schon geschrieben wurde, mit der Quersumme kann es sein dass du z.b. die gleichen Zeichn aber in einer anderen Abfolge hast. Oder dass du es schaffst mit anderen Zeichen ebenfalls die gleiche Quersumme zu erzielen.

Ob es für deinen Fall ausreicht, kannst du letztlich durch ausprobieren (einfach Rechnen) feststellen.
 
@CDX : deine Fragen gehen an der Idee, die hinter einer Checksumme steht, zum Teil "etwas" vorbei. Mag sein, dass man dir helfen kann - dafür müßtest du aber mal genau beschreiben was dein Anliegen ist. Dann gibt es dazu vielleicht einen Ansatz ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Es ist so, wie ich bei meinem letzten Beitrag geschrieben habe. Ziel ist ein Datenupdate.

Es gibt Typen (im TIA sind das UDTs). Die der Source haben andere Werte als die des Ziels. Nach erfolgtem Kopiervorgang sind beide gleich. Und die Quersumme ermittelt mir, aus meiner Sicht, irgendeinen Wert in Form eines Int. Ich könnte ihn bestimmt nachrechnen, aber ich versuche den Sinn dahinter zu verstehen.

Der in C geschriebene Code (ganz oben) ermittelt die Quersumme. Ist es richtig, dass die Werte, also darin steht z B die Temperatur eines Tanks berücksichtigt werden? Diese ist ja variabel, ich erwarte in dem Fall unterschiedliche Checksummen.

Oder bezieht sich diese Quersumme auf den Aufbau meines Types? Sprich der UDT

Tank A hat : Struct
Int
Int
Int
Real
Real
Bool
 
das kannst du doch einfach testen in du deine Schleife einfach mal auf den Temperaturwert des tanks "begrenzt" dann unterschiedliche Temperaturen simulierst.

Wenn dann unterschiedliche Checksummen rauskommen, wird der Wert mit Berücksichtigt werden und nicht die Struktur.
 
Also noch einmal :
Es wird nicht der Datentyp dabei berücksichtigt (und auch nicht erkannt) sondern es werden die Byte-Werte das angegebenen Bereichs aufaddiert. Auf diese Weise werden, wie schon von den Anderen erwähnt, bestimmte Geschichten nicht erkannt.
Beispiel : Hat ein String den Inhalt "ab" und der andere den Inhalt "ba" ergibt das dieselbe Checksumme. Gleiches gilt im Grunde auch für Zahlen, also INT oder REAL oder DATE oder TIME oder oder. Hier ist es allerdings etwas komplexer - der Wert 1234 ergibt nicht dieselbe Checksumme wie 4321.
Wenn du wirklich gezielt und sicher die Inhalte selbst vergleichen willst so geht dies nur in dem du deine Daten erstmal in einen neutralen Bereich senden läßt und dann die UDT-Inhalte einzeln (also SEND-Data mit Old-Data) vergleichst.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Tut mir leid, wenn ich etwas zu genau nachfrage. So wie ich bisher verstanden habe, ist es zu erwarten, dass meine Checksummen unterschiedlich sind. Den Sinn dahinter verstehe ich nicht, könnte mir nur derjenige sagen der den Code geschrieben hat... Wird schwierig.
 
Vielleicht noch mal zum Sinn von Checksummen ... das stammt aus der Zeit wo eine RS232-Schnittstelle der häufigst anzutreffende Kommunikationsweg zu anderen Geräten war. Diese Übertragung ist allerdings sehr störungsanfällig gewesen und es konnte dann schon mal passieren, dass durch externe Einflüsse (wie z.B. das Ein- oder Ausschalten von induktiven Verbrauchern) das eine oder andere Bit gekippt ist. Das läßt sich durch die Checksumme erkennen. Es war nie dafür gedacht um Wertänderungen in einem Datenblock zuerkennen - das sollte dir mein Beispiel schon verdeutlicht haben. Falls das noch nicht gereicht hat hier noch eins : der String "ad" hätte dieselbe Checksumme wie "bc"
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Checksummen (Prüfsummen) sind dafür gedacht, Datenblöcke auf fehlerhafte Bits z.B. durch Übertragungsfehler zu überprüfen ("checken"). Checksummen können mehr Fehler (veränderte Bits) entdecken als nur Paritäts-Bits. Um auch mehr als einen Bitfehler zu entdecken, die sich womöglich bei einfachen Prüfsummen-Verfahren gegenseitig aufheben, wird in der Datenübertragung meist komplexere CRC-Berechnung mit genormten "günstigen" Polynomen angewendet. CRC-Werte sind mehr als nur eine Prüfsumme, werden aber umgangssprachlich oft auch als Prüfsumme bezeichnet.
Es gibt auch Checksummen über Spalten und Zeilen von Datenblöcken, die können noch mehr Fehler entdecken und teilweise sogar angeben, welche Bits falsch/verändert sind und damit sogar reparieren, siehe z.B. Checksummen für CD/DVD und QR-Codes.
 
Zurück
Oben