roger: Fehler im Script beim Empfang von "fremden" Zahlen

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

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

    --
    Wenn der Kommentar nicht zum Code passt, kann auch der Code falsch sein.
  2. 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

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

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

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