Fehler im Script beim Empfang von "fremden" Zahlen
roger
- perl
Hallo,
ich bekomme von einem (meinem) C Programm per Socket Daten (Zahlen jedoch als String z.B. (20 45 4567 0).
Wenn ich jedoch eine "0" im Perlscript empfange, kommt die nachfolgende Fehlermeldung.
Argument "0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0..." isn't numeric in right bitshift (>>) at ./alert line 82.
$mem_messwert = $messwert >> 16;
ich habe auch schon vorher die whitespaces entfernt
$messwert =~ s/^\s+|\s+$//g;
Die Fehlermeldung tritt nur bei "0" auf. Jede andere Zahl funktioniert, soweit ich bis jetzt gesehen habe.
Auch ist egal an welcher Stelle im String die "0" steht.
Ich benutze split(/ /,string) um die werte in ein Array zu schreiben.
Danke
roger
hi,
Wenn ich jedoch eine "0" im Perlscript empfange, kommt die nachfolgende Fehlermeldung.
Prüf mal, wie die Null da ankommt, als "welches" Zeichen. Z.B. so:
printf qq(%vx), '1234567890'; # 31.32.33.34.35.36.37.38.39.30
In Deinem ankommenden String dürfen also nur o.g. Hexwerte vorkommen, die 0 sollte den HexWert 30 haben, da gibts auch keine Fehlermeldung.
Hotti
hi,
Argument "0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0..." isn't numeric in right bitshift (>>) at ./alert line 82.
Vermutlich kriegst Du hier keine 0 sondern eine Speicheradresse von Deinem c-Program ;-)
Hotti
Hallo
Argument "0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0..." isn't numeric in right bitshift (>>) at ./alert line 82.
Vermutlich kriegst Du hier keine 0 sondern eine Speicheradresse von Deinem c-Program ;-)
sprintf(buffer, ",%i", VarBuffer[i+1]);
strcat (sendestring,buffer);
Eine Adresse ist es nicht. Wie du siehst, habe ich die Zahl mit sprintf im C-Programm formatiert. Mehr kann ich doch nicht tun.
Wenn ich eine "0" manuell in den String eintrage und per socket sende funktioniert es auch nicht.
Ich kann mir das überhaupt nicht erklären.
Empfang: 1234
printf qq(%vx), $werte[$i]; -> bringt 31.32.33.34
Empfang: 0
printf qq(%vx), $werte[$i]; -> bringt 30.0.0.0.0.0.0.0.0. usw ca. 200x
Gruß
roger
hi,
printf qq(%vx), $werte[$i]; -> bringt 30.0.0.0.0.0.0.0.0. usw ca. 200x
Das deutet auf eine fehlerhafte Stringterminierung hin, wie CPAN schon bemerkte. Ich bin in c z.Z. ein bischen draußen, aber lies da mal nach, ob es da evntl. Probleme mit sprintf gibt. Ansonsten könntest Du da auch strcpy() verwenden. Und mit Perl in ein Socket zu schreiben, ist auch nur ein 3-Zeiler, aber vermutlich willst Du das Programm aus der Hand geben...
Hotti
Glückwunsch, dein C-Programm ist bezüglich der Stringterminierung kaputt. Nach jeder Ziffer Null (0x30h) kommen NULs (0x00h, in Perl repräsentiert als Oktalescape \0), das ist gewiss nicht so beabsichtigt. Als Workaround kannst du sie auch mit dem s-Operator entfernen, aber es ist besser, das C-Programm zu richten.