Rachus: Zahlen binär speichern

Guten Abend!

Schon längere Zeit versuche ich herauszufinden, wie ich in PHP Zahlen binär in eine Datei schreibe. Die Zahlen werden jedoch immer im ASCII-Format (also mit einem einfachen Texteditor lesbar) abgespeichert, egal welche Flags ich fopen mitgebe. Ich hätte es aber gerne, dass ich diese Zahlen in der Datei binär speichere und wieder auslese. Gibt es dazu eine Möglichkeit?

Schön, wenn ihr mir helfen könntet!

Rachus

  1. Hi,

    Schon längere Zeit versuche ich herauszufinden, wie ich in PHP Zahlen binär in eine Datei schreibe. Die Zahlen werden jedoch immer im ASCII-Format (also mit einem einfachen Texteditor lesbar) abgespeichert, egal welche Flags ich fopen mitgebe. Ich hätte es aber gerne, dass ich diese Zahlen in der Datei binär speichere und wieder auslese. Gibt es dazu eine Möglichkeit?

    Ich kann nur raten, was du vielleicht vorhaben könntest:

    Möchtest du gar nicht die Zahl selber speichern, sondern ihre Binär*darstellung* als Textstring aus Nullen und Einsen ...?

    Dann wandle sie in einen solchen um, bevor du sie in die Datei schreibst.

    MfG ChrisB

    --
    Light travels faster than sound - that's why most people appear bright until you hear them speak.
    1. Hello,

      Hi,

      Schon längere Zeit versuche ich herauszufinden, wie ich in PHP Zahlen binär in eine Datei schreibe. Die Zahlen werden jedoch immer im ASCII-Format (also mit einem einfachen Texteditor lesbar) abgespeichert, egal welche Flags ich fopen mitgebe. Ich hätte es aber gerne, dass ich diese Zahlen in der Datei binär speichere und wieder auslese. Gibt es dazu eine Möglichkeit?

      Ich kann nur raten, was du vielleicht vorhaben könntest:

      Die Frage war glasklar gestellt :-)

      Die üblichen PHP-Dateioperationen speichern Zahlen in ASCII-Darstellung, also human readable, und nicht in ihrer binären Darstellung als Zahlentyp. Das benötigt erstens viel mehr Platz und zweitens muss man ja auch manchmal mit Programmen/Programmiersprachen Daten austauschen, die die echten Datentypen verwenden.

      Liebe Grüße aus dem schönen Oberharz

      Tom vom Berg

      --
      Nur selber lernen macht schlau
      http://bergpost.annerschbarrich.de
      1. Hi,

        Ich kann nur raten, was du vielleicht vorhaben könntest:

        Die Frage war glasklar gestellt :-)

        Na ja, richtig geraten habe ich ja.

        Die üblichen PHP-Dateioperationen speichern Zahlen in ASCII-Darstellung, also human readable, und nicht in ihrer binären Darstellung als Zahlentyp. Das benötigt erstens viel mehr Platz und zweitens muss man ja auch manchmal mit Programmen/Programmiersprachen Daten austauschen, die die echten Datentypen verwenden.

        Dass der Frager nicht binär Speichern will (wenn er schon extra die erweiterten Flags von fopen erwähnt), sondern die binäre *Darstellung* von Zahlen, war nicht so glasklar.

        MfG ChrisB

        --
        Light travels faster than sound - that's why most people appear bright until you hear them speak.
        1. Schönen Tag!

          Sorry, falls es unklar war, aber Tom hat schon Recht. Ich will die Zahlen nicht als ASCII speichern, sondern als "Binärzahl", da ich Speicherplatz sparen will.
          Dann werde ich es mal mit den pack-Funktionen versuchen, bin mir aber unsicher, ob ich den Format-Parameter richtig verstanden habe...
          Beispiel: Ich will einen Integer $int in $string packen und dann wieder entpacken. Mache ich das dann so?

          $string=pack("V", $int);  
          $int=unpack("V", $string);
          

          Für mich sind die Funktionen leider noch etwas unübersichtlich.

          Viel Spaß beim Helfen!

          Rachus

          1. Hello,

            Beispiel: Ich will einen Integer $int in $string packen und dann wieder entpacken. Mache ich das dann so?

            $string=pack("V", $int);

            $int=unpack("V", $string);

              
            Nicht ganz richtig. Beim Entpacken wird gleich ein Array erzeugt:  
              
                code lang=php]  
                $string = pack("V", $int);  
                $\_data  = unpack("V", $string);  
              
                if (isset($\_data[0])  
                {  
                    $int = $\_data[0];  
                }  
                else  
                {  
                    $int = NULL;  
                }  
                [/code]  
              
            Ob man zum Packen auch eins übergeben kann, muss ich selber erstmal ausprobieren. Laut Handbich jedenfalls nicht.  
              
              
              
              
              
            Liebe Grüße aus dem schönen Oberharz  
              
              
            Tom vom Berg  
            ![](http://selfhtml.bitworks.de/Virencheck.gif)  
              
            
            -- 
            Nur selber lernen macht schlau  
            <http://bergpost.annerschbarrich.de>  
              
            
            
            1. Hi,

              Hello,

              Beispiel: Ich will einen Integer $int in $string packen und dann wieder entpacken. Mache ich das dann so?

              $string=pack("V", $int);

              $int=unpack("V", $string);

              
              >   
              > Nicht ganz richtig. Beim Entpacken wird gleich ein Array erzeugt:  
              >   
              >     code lang=php]  
              >     $string = pack("V", $int);  
              >     $\_data  = unpack("V", $string);  
              >   
              >     if (isset($\_data[0])  
              >     {  
              >         $int = $\_data[0];  
              >     }  
              >     else  
              >     {  
              >         $int = NULL;  
              >     }  
              >     [/code]  
              >   
                
              Leider muss ich dir sagen, dass dein Code nicht funktioniert. Aus mir unerfindlichen Gründen ist nämlich die Zahl im Arrayeintrag $int[1] und nicht in $int[0]. Welchen Grund gibt es jetzt dafür? Ist das immer so?  
                
              
              > Ob man zum Packen auch eins übergeben kann, muss ich selber erstmal ausprobieren. Laut Handbich jedenfalls nicht.  
              >   
              >   
                
              Das wäre aber für mich persönlich nicht einmal ein Problem. Die Funktion dafür müsste man ja relativ einfach auch selbst schreiben können.  
                
              
              >   
              >   
              >   
              > Liebe Grüße aus dem schönen Oberharz  
              >   
              >   
              > Tom vom Berg  
              > ![](http://selfhtml.bitworks.de/Virencheck.gif)  
              >   
              >   
                
              Ich kann nur Grüße aus dem bewölkten Franken wünschen...  
                
              Rachus
              
              1. Hello,

                Leider muss ich dir sagen, dass dein Code nicht funktioniert. Aus mir unerfindlichen Gründen ist nämlich die Zahl im Arrayeintrag $int[1] und nicht in $int[0]. Welchen Grund gibt es jetzt dafür?

                Ich habe beim Entpacken den Bezeichner vergessen:

                  
                  
                   $packed = pack('VVVV', 10,20,30,40);  
                   $_data = unpack ('Vzehn/Vzwanzig/Vdreissig/Vvierzig', $packed);  
                  
                   echo "<pre>\r\n";  
                   echo htmlspecialchars(priont_r($_data, 1));  
                   echo "</pre>\r\n";  
                  
                
                

                Liebe Grüße aus dem schönen Oberharz

                Tom vom Berg

                --
                Nur selber lernen macht schlau
                http://bergpost.annerschbarrich.de
                1. Guten Tag nochmal,

                  Ich habe beim Entpacken den Bezeichner vergessen:

                  $packed = pack('VVVV', 10,20,30,40);
                     $_data = unpack ('Vzehn/Vzwanzig/Vdreissig/Vvierzig', $packed);

                  echo "<pre>\r\n";
                     echo htmlspecialchars(priont_r($_data, 1));
                     echo "</pre>\r\n";

                  
                  >   
                    
                  Danke! Ich habe das jetzt als Funktionen geschrieben und es funktioniert bestens. Allerdings möchte ich doch noch fragen, ob das nicht schneller ginge? Ich könnte mir nämlich vorstellen, dass  
                  1\. durch die Funktionsaufrufe das Skript stark verlangsamt wird.  
                  2\. ein Assoziatives Array einen langsamen Zugriff ermöglicht, wodurch die Funktionsgeschwindigkeit nochmals reduziert wird.  
                    
                  Hier einmal mein Testscript:  
                    
                  ~~~php
                  <?php  
                  function macheBinaer($zahl)  
                  {  
                  	return pack('V', $zahl);  
                  }  
                    
                  function macheString($zahl)  
                  {  
                  	$array=unpack('Vzahl', $zahl);  
                  	return $array['zahl'];  
                  }  
                    
                  $int=macheBinaer(15);  
                  echo macheString($int);  
                  ?>
                  

                  Schönen Abend noch!

                  Rachus

                  1. Hello,

                    Danke! Ich habe das jetzt als Funktionen geschrieben und es funktioniert bestens. Allerdings möchte ich doch noch fragen, ob das nicht schneller ginge? Ich könnte mir nämlich vorstellen, dass

                    1. durch die Funktionsaufrufe das Skript stark verlangsamt wird.
                    2. ein Assoziatives Array einen langsamen Zugriff ermöglicht, wodurch die Funktionsgeschwindigkeit nochmals reduziert wird.

                    Die Umformatiererei macht das Ganze extrem langsam.

                    Ich habe da mal eine Emulation für imagerotate() zusammengebastelt, weil das im PHP auf Debian nicht enthalten war. Das Script ist fast eingeschlafen. Die Originalfunktion aus der GD-Lib war hingegen angenehm schnell...

                    PHP ist nicht für den Zugriff auf Flat-Files gebaut, auch wenn es diesen ermöglicht. Aber die Funktionen sind alle etwas dürftig.

                    Wenn Du eine Alternative suchst, mit PHP binäre Massendaten sparsam und schnell abzulegen, dann nimm eine Datenbank als Persistenten Speicher. Das geht dann vermutlich schneller.

                    Liebe Grüße aus dem schönen Oberharz

                    Tom vom Berg

                    --
                    Nur selber lernen macht schlau
                    http://bergpost.annerschbarrich.de
                    1. Servus,

                      Wenn Du eine Alternative suchst, mit PHP binäre Massendaten sparsam und schnell abzulegen, dann nimm eine Datenbank als Persistenten Speicher. Das geht dann vermutlich schneller.

                      Eigentlich wollte ich eine Datenbank selbst machen. Dass es dann langsam ist, macht mir keine Probleme, ist aber schon etwas schade. Ich wollte das nämlich nur aus Spaß machen (damit ich mal selber überlege, wie so eine Datenbank überhaupt funktioniert).

                      Naja, danke für die Hilfe!

                      Noch ein schönes Wochenende!

                      Rachus

                      1. Hello,

                        Wenn Du eine Alternative suchst, mit PHP binäre Massendaten sparsam und schnell abzulegen, dann nimm eine Datenbank als Persistenten Speicher. Das geht dann vermutlich schneller.

                        Eigentlich wollte ich eine Datenbank selbst machen. Dass es dann langsam ist, macht mir keine Probleme, ist aber schon etwas schade. Ich wollte das nämlich nur aus Spaß machen (damit ich mal selber überlege, wie so eine Datenbank überhaupt funktioniert).

                        Dann würde ich für die Datenbank lieber eine Hochsprache benutzen, C, C++, Pascal, ...
                        Mit PHP haben Dennis und ich uns da schon mal öffentlich intensive Gedanken gemacht.
                        http://tutorial.riehle-web.com/scripts/index.php#flatbox
                        und
                        http://forum.de.selfhtml.org/archiv/2006/2/t124002/#m798543 "Flatbox"
                        ich weiß leider nicht mehr, wann das begonnen hatte

                        Da wurden von uns in einem länglicheren Thread mehrere Möglichkeiten der persistenten Datenverwaltung mit PHP durchexerziert.

                        Außerdem findest Du noch ein paar Gedanken zu diesem Thema unter
                        http://selfhtml.bitworks.de/ -> konfigurierbare Adressverwaltung
                        Die basiert auf einer Ramdom-Access-Datei, die zwar auf die echten Typen verzichtet, aber trotzdem mit einem Blockbuffer mit ficer Größe arbeitet. Auch das wird von PHP nicht befriedigend unterstützt.

                        Liebe Grüße aus dem schönen Oberharz

                        Tom vom Berg

                        --
                        Nur selber lernen macht schlau
                        http://bergpost.annerschbarrich.de
                        1. Hallo,

                          Wenn Du eine Alternative suchst, mit PHP binäre Massendaten sparsam und schnell abzulegen, dann nimm eine Datenbank als Persistenten Speicher. Das geht dann vermutlich schneller.

                          Außerdem findest Du noch ein paar Gedanken zu diesem Thema unter
                          http://selfhtml.bitworks.de/ -> konfigurierbare Adressverwaltung
                          Die basiert auf einer Ramdom-Access-Datei, die zwar auf die echten Typen verzichtet, aber trotzdem mit einem Blockbuffer mit ficer Größe arbeitet. Auch das wird von PHP nicht befriedigend unterstützt.

                          ja eben. Warum selbst machen, wenn es x Datenbankmanagementsysteme gibt, die von PHP unterstützt werden - und sei es die SQLite-Anbindung. Wenn Du eine Webspace mit DB benötigst und Dir Dein Hoster das nicht bietet, dann gehst Du halt zu einem, der das bietet. Kostet ja nur ein paar Cent pro Monat, wenn überhaupt.

                          Will man hingegen selbst ein DBMS entwickeln, dann sollte man diese Aufgabe mit passendem Werkzeug angehen, wie Du schreibst:

                          Dann würde ich für die Datenbank lieber eine Hochsprache benutzen, C, C++, Pascal, ...

                          Freundliche Grüße

                          Vinzenz

                          1. Hello Vinzenz,

                            Will man hingegen selbst ein DBMS entwickeln, dann sollte man diese Aufgabe mit passendem Werkzeug angehen, wie Du schreibst:

                            Dann würde ich für die Datenbank lieber eine Hochsprache benutzen, C, C++, Pascal, ...

                            Aber den Spaß daran, es selber zu hinterfragen und selbst zu machen [oder war das jetzt umgekehrt mit selber und selbst?] wollen wir Rachus ja hoffentlich nicht nehmen. Deshalb auch die Links auf Dennis' und meine Übungen, die ich hier verlinkt habe.

                            Auch die Erkenntnis darüber, dass vieles in höheren Programmiersprachen ab Level 3 nicht mehr geht, ist eine wichtige und es ist manchmal erstaunlich, welche höhere Programmiersprache (dren Entwickler) sich von Anfang an welche Gedanken gemacht haben und welche erst später darauf gekommen sind, dass sie etwas "reparieren" müssten.

                            Auch Bjarne Stroustrup gesteht ein, dass er C++ mit den heutigen Kenntnissen anders designed hätte.

                            Nach meinem heutigen Wissensstand würden Embarcadereo http://www.embarcadero.com/ und auf Platz Zwei C# sicherlich die SprachSYSTEME sein, die ich lernen und durchschauen wollte...
                            Mal sehen, ob meine Zeit dafür noch ausreicht.

                            Alle Plattformen erreichen diese selbstverständlich auch nicht.

                            Liebe Grüße aus dem schönen Oberharz

                            Tom vom Berg

                            --
                            Nur selber lernen macht schlau
                            http://bergpost.annerschbarrich.de
                  2. Hi,

                    <?php

                    function macheBinaer($zahl)
                    {
                    return pack('V', $zahl);
                    }

                    $int=macheBinaer(15);

                      
                    Bevor du das jetzt so nutzt, um die Zahl 15 in deine Datei zu schreiben, solltest du dir noch mal die Ausgabe von  
                    `var_dump(macheBinaer(15));`{:.language-php}  
                    anschauen.  
                      
                    MfG ChrisB  
                      
                    
                    -- 
                    Light travels faster than sound - that's why most people appear bright until you hear them speak.
                    
                    1. Hallo,

                      Hi,

                      <?php

                      function macheBinaer($zahl)
                      {
                      return pack('V', $zahl);
                      }

                      $int=macheBinaer(15);

                      
                      >   
                      > Bevor du das jetzt so nutzt, um die Zahl 15 in deine Datei zu schreiben, solltest du dir noch mal die Ausgabe von  
                      > `var_dump(macheBinaer(15));`{:.language-php}  
                      > anschauen.  
                      >   
                      > MfG ChrisB  
                      >   
                      >   
                        
                      Habe ich gemacht! Allerdings ist alles so, wie es sein soll (jedenfalls laut meines HEX-Editors). Es wird ein String zurückgegeben, der aus 4 "Zeichen" besteht, wobei die Zeichen die Werte 0x0f 0x00 0x00 0x00 haben. Das ist genau das, was ich wollte! Es funktioniert soweit gut!  
                        
                      Schöne Grüße!  
                        
                      Rachus
                      
                      1. Hello,

                        Habe ich gemacht! Allerdings ist alles so, wie es sein soll (jedenfalls laut meines HEX-Editors). Es wird ein String zurückgegeben, der aus 4 "Zeichen" besteht, wobei die Zeichen die Werte 0x0f 0x00 0x00 0x00 haben. Das ist genau das, was ich wollte! Es funktioniert soweit gut!

                        ... war ja auch zu erwarten :-)

                        Aber man sieht daran gut, dass der Speicherplatzvorteil der binären Präsentation gegenüber der ASCII-Präsentation erst für ganze positive Zahlen > 9999 greift oder für negative ganze Zahlen < -999 ...

                        Liebe Grüße aus dem schönen Oberharz

                        Tom vom Berg

                        --
                        Nur selber lernen macht schlau
                        http://bergpost.annerschbarrich.de
  2. Hello,

    Schon längere Zeit versuche ich herauszufinden, wie ich in PHP Zahlen binär in eine Datei schreibe. Die Zahlen werden jedoch immer im ASCII-Format (also mit einem einfachen Texteditor lesbar) abgespeichert, egal welche Flags ich fopen mitgebe. Ich hätte es aber gerne, dass ich diese Zahlen in der Datei binär speichere und wieder auslese. Gibt es dazu eine Möglichkeit?

    Dafür gibt es die Funktionen pack() (zum Wegschreiben) und unpack() (zum Wiederholen)

    http://de2.php.net/manual/en/function.pack.php
    http://de2.php.net/manual/en/function.unpack.php

    Die sind zwar ein wenig unhandlich, aber sie sind die einzige praktikable Möglichkeit in PHP.
    Eine unpraktische Möglichkiet wäre noch die Berechnung per Bitoperationen.

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
    Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de