Forum: PC-Programmierung perl skript intapretieren.


von Pindrei P. (pindrei)


Lesenswert?

Hallo,

ich versuche momentan ein serielles Kommunikationsprotokoll zu 
implementieren. Dazu benötige ich jedoch am Ende eine Checksumme.
Leider existieren keine Herstellerangaben, jedoch habe ist ein Beispiel 
in "perl" gefunden.
1
sub checksum16 ($) {
2
# calculates the checksum 16 of the given string argument
3
  my @bytes = unpack("C*", $_[0]);
4
  my $sum = 0;
5
  foreach(@bytes) {
6
    $sum += $_;
7
    $sum %= 2**16;
8
  }
9
  return $sum;
10
}

Bedauerlicherweise habe ich mit Perl noch nie gearbeitet. Kann mir 
jemand erklären, wie die Summe berechnet wird?

MfG

pindrei

von Yalu X. (yalu) (Moderator)


Lesenswert?

Pindrei P. schrieb:
> Bedauerlicherweise habe ich mit Perl noch nie gearbeitet.

Ich auch nicht. Trotzdem ist es doch fast offensichtlich, dass hier eine
Bytesequenz Byte für Byte modulo 2**16 (2 hoch 16) aufsummiert wird.

Könnte das hinkommen?

von Pindrei P. (pindrei)


Lesenswert?

Yalu X. schrieb:
> dass hier eine
> Bytesequenz Byte für Byte modulo 2**16 (2 hoch 16) aufsummiert wird.

also:

cahr c[10];
for (int i=0;i<10;i++)
{
    y += x[i];
    y %= 65536;
}

ich teste das mal. 2**16 kannte ich nicht.

danke für die schnelle Antwort

von Yalu X. (yalu) (Moderator)


Lesenswert?

Ja, so hätte ich gesagt. y musst du vorher natürlich noch auch 0 setzen.
y %= 65536 kann auch am Ende außerhalb der Schleife stehen, das ändert
am Ergebnis nichts. Du kannst diese Anweisung auch ganz weglassen, wenn
du y vom Typ uint16_t machst, da dann jede Addition automatisch modulo
2**16 gerechnet wird.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Pindrei P. schrieb:
> 2**16 kannte ich nicht.

Stammt aus FORTRAN-Zeiten.

Wobei ich in Perl auch "% 65536" oder "& 0xFFFF" geschrieben hätte.

von Vlad T. (vlad_tepesch)


Lesenswert?

wobei das eine ganz schön schäbige Checksumme für ein 
Kommunikationsprotokoll ist.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.