String binär lesen, array

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • String binär lesen, array

    Hallo PHPler,

    anbei gleich 2 Fragen, konnte im Forum leider nichts finden.

    Ich habe einen binären string aus einem socket gelesen. (nicht fsockopen!), leider kann ich den string nicht mit explode zerlegen und ein array daraus machen, allerdings weiss ich wie sich der string aufbaut. wie kann ich nun den binärstring umwandeln ? Ich würde ja gern den string mal posten, aber leider sind zuviele zeichen enthalten die man hier nicht lesen könnte. substr() kann da nicht die lösung sein das würde ewig dauern.

    String: (byte)(byte)(int32)(word)(word)(int16)(byte)(char)

    Dann hab ich noch einen string aus dem ich ein array machen will:

    String: key1\value1\key2\value2\key3\value3\.....\keyn\valuen

    Ich habe mit explode("\\") den string zerlegt, allerdings ist es jetzt ein ewiger code wo ich dann das array mit key1=>value1 ... aufbaue. geht das nicht auch noch einfacher? habs mit preg_match(_all) auch ausprobiert, aber da kam nicht das raus was ich wollte.

    Array(
    key1 => value1,
    key2 => value 2,
    keyn => valuen
    )

    Für ansätze sowie für lösungen wäre ich total dankbar.

    gruss und guten morgen bzw. nacht

  • #2
    fürs erste könnte man evtl regex nehmen. aber da kann man so nicht viel zu sagen.

    2. würde ich ein explode machen, und dann halt mit ner schleife. das sind maximal 4 zeilen.

    Kommentar


    • #3
      Re: String binär lesen, array

      jepp, für's zweite würde ich auch so vorgehen, wie tobiaz es vorschlägt:

      "key1\value1\key2\value2\key3\value3"

      exploden am \, ergibt ein array (nennen wir es mal $altesarray) mit "key1", "value1", "key2", "value", etc.


      zuerst ermittelst du die arraylänge, also anzahl der einträge - im obigen beispiel sind das 6 stück.

      jetzt lässt du eine schleife mit zählvariable $i von 0 bis (arraylänge/2)-1 laufen (hier also von 0 bis 2), und weist innerhalb dieser dann dem array die werte zu:
      PHP-Code:
      $neuesarray[$altesarray[$i*2]) = $altesarray[$i*2+1]; 
      I don't believe in rebirth. Actually, I never did in my whole lives.

      Kommentar


      • #4
        Super, danke für den Ansatz, hat mir weiter geholfen.
        ich hab es jetzt auf mein script angepasst un es läuft :

        PHP-Code:
        $array explode("\\"$buffer);
        $result = array();

        for ( 
        $i 1$i <= sizeof($array)/$i++ ) {
                 
        $result[$array[$i*2-1]] = $array[$i*2];
        }
        print_r($result); 
        Allerdings hänge ich jetzt wieder bei meinem ersten Problem. Ich hab meinen Log-relay jetzt so umgestezt, dass er zumindest nach jedem (byte) oder (string) mir ein \x00 mitsendet... chr(0)

        Wenn ich den String nun mit $array = explode( "\x00", $buffer) zerlege, dann bekomm ich die stringwerte schoen in einem array angezeigt, allerdings hat er probleme mit einigen binärzeichen mit ord(), kann ich mir zwar einige sichtbar machen, aber irgendwie nicht alle. mit fsockopen() und read($fp,1) läuft es, aber mit dem socket_read() noch nicht so ganz. wenn ich miir mit print_r($buffer) den string anzeigen lasse, dann bekomm ich nur die hällfte ausgegeben und er zerstört mir sogar den plain/text header.

        Irgendeine Idee dazu ?

        Kommentar


        • #5
          kannst du die zeichen denn anzeigen, wenn du mirt readfile() die datei ausgibst?

          Kommentar


          • #6
            Moin,

            ich arbeite ja leider nicht mit nem file. sondern mit den socket funktionen. die daten bekomm ich über ein logrelais gesendet und empfange die an meinem socket. somit hab ich nur einen string den ich darstellen kann.

            andere idee ?

            hat jemand schonmal mit unpack gearbeitet ? hab versucht den string damit zu zerlegen, aber an einigen stellen hab ich noch probleme damit, anderes zeigt er wunderbar an.

            gruss grizz

            Kommentar


            • #7
              ahso. also, wenn das durch die funktion geht, kannst du den string nicht mehr lesen (oder zeichen davon). Geht das denn, wenn du den gesamten string ausgibst

              Kommentar


              • #8
                Es ist so, das ich mit socket_read() und socket write() arbeite, ich empfange ein packet und schreibe es in $buffer. der buffer enthällt dann das ganze packet als string, wenn ich den string im plain/text ausgebe, dann sehe ich das was in textform (string) (char) angegeben ist und halt den binären steuercode dazu in form von punkten oder quadraten etc.

                ich muss nun das was string und char ist auslesen. und dazwischen den binärcode mit (ord) sichtbar machen. ich habe die funktion vorher mit fsockopen() und fread() gemacht und dann byteweise den string ausgelsenen in ein unpack('typ', $var) gegeben, allerdinsg kann ich den socket_read() nicht byteweise auslesen. ausserdem wenn der string eine länge von 1500 bytes hat, dann ist es nicht sinvoll jedes einzelne byte durch eine function auszulesen.

                vielleicht hilf das weiter.

                gruss grizz

                Kommentar


                • #9
                  <schieb>

                  na keiner mehr eine Idee ?

                  Kommentar


                  • #10
                    Hmm, man kann ja in str_replace auch Arrays als Argumente einsetzen und so auf einen Schlag recht performancetreu haufenweise Zeichen ersetzen.
                    Ich würde mir ne Funktion basteln, der ich den String übergebe und als Returnwert den "bereinigten" (anzuzeigenden) String zurückbekomme.

                    Man könnte also für jedes Sonderzeichen ein Quadrat anzeigen lassen und die "normalen" Zeichen unangetastet lassen.
                    Das liefe jetzt aber auf eine recht großes Such- und Ersetzungsarray hinaus.

                    Ich meine, dass es auch geht str_replace zusammen mit Reg-Exs zu benutzen, aber da weiss ich leider auch nicht, wie es genau geht.

                    Vielleicht bringt Dich das auf neue Lösungswege?

                    Kommentar


                    • #11
                      Ich hab es jetzt so gemacht und es funktioniert super, hab diese funktion für (char)(byte)(string)(int)(float) geschrieben:

                      das ganze funktioniert fast wie in Perl, nur mit leerzeichen kommt er nicht klar deswegen ersetz ich erst alle leerzeichen duch ESC, in der funktion selbst schreib ich dann das ESC zu SP zurück :-) um es für die anderen datentypen zu benutzen, einfach den unpack ändern und den substr am buffer anpassen :-)

                      PHP-Code:
                      $buffer str_replace"\x20""\x1B"$buffer); 
                      dann jage ich den $buffer durch die funktion. wichtig ist die referenz, denn sonst schneidet sich der buffer ja nicht ab :-)

                      PHP-Code:
                      function _unpack_string(&$buffer$count 1){

                      $string = array();
                      for(
                      $i 1$i <= $count$i++){
                          do {
                              
                      $a unpack ('A1var'$buffer);
                              
                      $byte $a['var'];
                              
                      $buffer substr($buffer1);
                              if (
                      $byte == "\x1B")
                                  {
                      $byte " ";}
                              @
                      $string[$i] .= $byte;
                          }while ( 
                      $byte != "\x00" );
                      }

                      if (
                      $count == 1){
                          return 
                      $string[1];
                      }

                      return 
                      $string;

                      den count hab ich mit reingenommen um gleich mehrere strings nacheinander zu ziehen. unpack macht immer ein array.

                      vielleicht kann es ja noch jemand gebrauchen.

                      GruZZ und Danke GriZZ

                      Kommentar

                      Lädt...
                      X