• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[gelöst] XOR Checksumme von String in Bash berechnen

Hallo,
ich möchte mir ein kleines Bash Skript für eine LED-Laufschrift schreiben. Dazu brauche ich die XOR Checksumme von meinem Message String und muss diese als 2 Byte hinter dem String senden.
Wie kann ich das ich das in Bash machen? :???:

Mein bisheriges Bash Skript (nicht gut aber es funktioniert schonmal, das heißt die Zeichen kommen richtig auf der seriellen Schnittstelle raus):
Code:
#!/bin/bash

#Schnittstellenparameter setzen
stty -F /dev/ttymxc0 9600 cs8 -cstopb

while true;
do
    before=$(mpc -h localhost -f "%title% %artist%" current)
    after=$(mpc -h localhost -f "%title% %artist%" current)
    while [ "$before" = "$after" ];
    do
      after=$(mpc -h localhost -f "%title% %artist%" current)
      #echo aktualisieren
      sleep 5
    done
    message=$(mpc -h localhost -f "%title% von %artist%" current)
    echo "<ID00><L1><PB><FA><MC><WA><FA>$message(Hier die Checksumme mit 2 Byte)<E>"  > /dev/ttymxc0
    echo "Übertragung beendet: $message"
done

Kleine beschreibung: Mit mpc wird der aktuell gespielte Song geholt und alle 5 Sekunden mit dem alten verglichen. Ist der neue String anders als der alte wird der Songtitel zur Laufschrift übertragen.
 

abgdf

Guru
Leider weiß ich nicht genau, was eine "XOR Checksumme" ist, ich nehme mal an dieses, müßte mich aber länger damit beschäftigen, um das zu verstehen.
Soweit ich sehe, gibt es dafür kein spezielles bash-Tool (gute, aber andere Prüfsummen liefert "md5sum").
In Perl wurde was mit XOR mal hier diskutiert. Anhand des letzten Postings dort, könntest Du z.B. mal auf der Konsole sowas versuchen:
Code:
echo $message | perl -wnle 'print 0xff ^ unpack "%8C*", pack"H*", $_'
Aber keine Garantie, daß Du mit dem Wert, der da herauskommt, was anfangen kannst.
Ich verstehe diesen Perl-Code leider auch nicht wirklich, denn mit "pack()", "unpack()" und auch "map()" stehe ich auf Kriegsfuß, das heißt, ich vermeide das normalerweise und schreibe die Sachen, die es aufgrund der allzu verkürzten und dadurch schwer verständlichen Schreibweise macht, lieber aus ...
 
OP
N

netphoenix86

Newbie
Danke für deine schnelle Antwort :)
Das Thema hat sich erledigt, da ich ein fertiges Perl Programm gefunden habe das ohne Probleme auf dem "Wandboard" (ein kleines ARM-System wie der Raspberry Pi) läuft.
Wen es interessiert: http://home.ircnet.de/cru/ledticker/

Das ding läuft jetzt wunderbar mit einer Festplatte, dem LED Ticker und dem MPD (Music Player Daemon) an meinem Audio Reciever.
Coole Sache :)
 

abgdf

Guru
Trotzdem würde ich gerne wissen, ob die Perl-Zeile, die ich oben angegeben hatte, das Ergebnis liefert, das Du Dir vorgestellt hattest.
 
OP
N

netphoenix86

Newbie
Nein, leider nicht. Die Werte waren alle anders als die mit dem mitgeliefertem Programm berechneten.
Hier der Auszug aus dem Perl Skript (hätte es in Delphi(Pascal) genauso gemacht, sogar der befehl ord ist gleich)
Code:
# $value=checksum($string)
# Calculates a string's checksum
#
# Parameters:
#   $string     : string to checksum
#
# Returns:
#   $value      : checksum, integer 0..255
#
sub checksum{
	my($string)=@_;
	return(undef) unless(defined($string));
	my $value=0;
	my $i;
	for($i=0; $i < length($string); $i++){
		$value=$value^ord(substr($string,$i,1));
	}
	return($value);
}
 

abgdf

Guru
Hmm, ok, weiß nicht, was da schiefgelaufen ist.
Die Funktion könnte man jedenfalls auch zu einem Einzeiler kürzen:
Code:
echo "Hallo"| perl -lne '$v=0;for$i(0..length){$v=$v^ord(substr($_,$i,1))}print$v'
 
OP
N

netphoenix86

Newbie
hm danke. Bliebe nur noch das Problem das Perl mir zusätzlich noch bei jedem start etwas anderes ausgibt. Irgendwas mit meinen Locales wäre nicht in ordnung sagt er mir immer. Stört mich so nicht weiter aber wenn das in der Ausgabe mit drin ist wird es zum Problem.
 

abgdf

Guru
netphoenix86 schrieb:
Bliebe nur noch das Problem das Perl mir zusätzlich noch bei jedem start etwas anderes ausgibt. Irgendwas mit meinen Locales wäre nicht in ordnung sagt er mir immer. Stört mich so nicht weiter aber wenn das in der Ausgabe mit drin ist wird es zum Problem.
Das dürfte ein allgemeineres Problem sein:

http://stackoverflow.com/questions/2499794/how-can-i-fix-a-locale-warning-from-perl

Mal was mit "LC_ALL=de_DE.UTF-8" in "~/.bashrc" versuchen.
 
Oben