Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Zahl binaer in Datei schreiben / auslesen

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Zahl binaer in Datei schreiben / auslesen

    Hallo PHP.de-Community,

    ich hab das folgende Problem:
    Ich hab ein Array (enthält nur ganze Zahlen, alle positiv) mit einer variablen Anzahl von Elementen. Diese Zahlen aus dem Array möchte ich jetzt in eine Datei schreiben, und dachte mir um die Dateigröße möglichst gering zu halten die Zahlen binär reinzuschreiben.
    Weil wenn ichs nicht binär mache würde ja für jede Ziffer ein Byte (das ist doch ein Byte?) draufgehen, binär könnte man doch die Zahl in ein Byte schreiben.
    Das ist meien Theorie, ich hab kaum Erfahrung auf diesem Gebiet.

    Wenn das geht, wie mache ich es? Hab geggoogelt und die Suchfunktion benutz - ohne guten Vorschlag - kann natürlich sein das ich zu dumm zum Suchen bin...

    Ich hoffe ich habs ins richtige Forum (PHP-Anfänger) gepostet.

    Gruß, Tim

    EDIT:

    Würd mich auch interessieren wie ich die Daten wieder aus der Datei in ein Array einlesen kann... (ist aber nicht ganz so wichtig)

  • #2
    Stichworte: decbin , fwrite ...
    PHP-Code:
    if ( $humans >= ) {
       
    war ();

    Kommentar


    • #3
      erstmal Danke für die schnelle Antwort...

      als fwrite kenn ich schon und ich weiß auch das man damit binär in Dateien schreiben kann wenn ich z.B. aus 'a' 'ab' mache...
      Ich hab mal nachgeschaut und decbin macht aus der Zahl Nullen und Einsen,
      und gibt diese 32 lange Zeichenkette als String aus.
      Soll ich jetzt einfach bei fopen() z.b.'ab' nehmen und als zuzufügender Inhalt die mit decbin erstellete Zeichenkette?

      Kommentar


      • #4
        Zitat von TimBob1994 Beitrag anzeigen
        Ich hab mal nachgeschaut und decbin macht aus der Zahl Nullen und Einsen,
        und gibt diese 32 lange Zeichenkette als String aus.
        Eben, decbin(255) würde also bspw. "11111111" ergeben.

        Soll ich jetzt einfach bei fopen() z.b.'ab' nehmen und als zuzufügender Inhalt die mit decbin erstellete Zeichenkette?
        Überleg' bitte selbst: Sparst du wirklich Speicherplatz, wenn du statt der drei Zeichen 255 die acht Zeichen 11111111 in deine Datei schreibst ...?

        Entweder nutzt du chr(255), oder irgendeine der Möglichkeiten, die pack() anbietet.
        [SIZE="1"]RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?[/SIZE]

        Kommentar


        • #5
          ist schon klar... das ist aber nicht das was ich meine.

          Nehmen wir mal an wir haben eine einfache Textdatei (.txt, Ascii) mit folgendem Inhalt:
          b

          Der dazugehörige Ascii Code ist 98. 98 ist binär 1100010 (laut decbin() ).
          Auf dem Datenträger wo die Datei liegt ist das ja denn irgendwie drauf.

          Und wenn ich jetzt eine Zahl hab wie zum beispiel 201 dann wäre es doch platzsparender wenn ich anstatt 201 (als String = 3 Ziffern = 3 Zahlen)
          201 als Zahl speichere.

          Bei pack() hab ich das mit dem format nicht ganz verstanden.

          Kommentar


          • #6
            Zitat von TimBob1994 Beitrag anzeigen
            Und wenn ich jetzt eine Zahl hab wie zum beispiel 201 dann wäre es doch platzsparender wenn ich anstatt 201 (als String = 3 Ziffern = 3 Zahlen) 201 als Zahl speichere.
            Dann mach das.
            [SIZE="1"]RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?[/SIZE]

            Kommentar


            • #7
              meine Frage ist (und war von Anfang an) WIE?

              Kommentar


              • #8
                Zitat von TimBob1994 Beitrag anzeigen
                meine Frage ist WIE?
                Und meine Antwort ist OBEN ...!
                [SIZE="1"]RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?[/SIZE]

                Kommentar


                • #9
                  ja aber die Zahlen aus meinem Array sind alle kleiner als 65792 und meißtens größer als 255 also scheidet chr() aus.

                  Und pack() hab ich nicht ganz verstanden (wie oben gesagt)...
                  Außerdem hab ich ein Array mit variabler Länge und weiß nicht wie ich das als einzele Attribute in diese Funktion bekomme ($zahl1,$zahl2,$zahl3)

                  PS: Danke das du dir die Zeit nimmst...

                  Kommentar


                  • #10
                    Pack wird in deinem Fall so verwendet
                    PHP-Code:
                    pack('s'1155); 
                    Zum auslesen dann mit unpack. Darfst aber nur immer 2Byte übergeben.

                    Kommentar


                    • #11
                      also nehm ich fwrite($connection,pack('s',1155)); wobei der $connection das binär Attribut hat?

                      aber 's' ist doch für "vorzeichenbehaftete" Zahlen (16 Bit), vorzeichenbehaftet steht meiner Meinung nach dafür das die Zahl sowohl positiv als auch negativ sein. Wäre für meine Fall nicht villt 'S' oder 'L' besser?

                      also 2 byte sind 16 bits ... reicht das aus?

                      Kommentar


                      • #12
                        Den Wertebereich musst du schon selber festlegen...

                        Ist
                        - deine kleinste Zahl > 0? Wenn ja, kannst du vorzeichenlose Zahlen verwenden
                        - die größte Zahl > 65535 (32767 bei vorzeichenbehafteten Zahlen)? Wenn ja, muss du den nächstgrößeren Datentypen benutzen (4 Byte anstatt 2 Byte)
                        Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

                        Kommentar


                        • #13
                          Hab ich ja oben gesagt... Reicht nicht ganz aus, also nehm ich 'L'...

                          Bleibt noch eine letzte Frage zu klären:

                          ist pack('L',$zahl1,$zahl,$zahl3,...) das selbe wie
                          pack('L',$zahl1).pack('L',$zahl2).pack('L',$zahl3) ....
                          ?

                          wenn nicht wie bekomm ich das Array so das die einzelnen Elemente als einzelne Parameter genommen werden?

                          Danke erstmal an alle die sich Zeit zur Lösung des "Problems" genommen haben.

                          Kommentar


                          • #14
                            PHP: call_user_func_array - Manual

                            Kommentar


                            • #15
                              also ich hab folgendes versucht und bin gescheitert:
                              PHP-Code:
                              $meinArray[0] = 'L';
                              $meinArray[1] = 1;
                              $meinArray[2] = 122;
                              $meinArray[3] = 1055;
                              // etc...

                              echo call_user_func_array("pack",$meinArray); 
                              Daraufhin bekomm ich folgende Warnung:
                              Warning: pack() [function.pack]: 17 arguments unused in /users/******/www/test/test.php on line 14

                              Was mach ich falsch?

                              Kommentar

                              Lädt...
                              X