AndiDog: Zahl aus einer Binärdatei lesen

Ich habe eine Datei, die 4 Bytes mit der Hexadezimalen 11223344h zum Testen enthält (= normale Größe einer Integerzahl). Wenn ich nun aber diese Zahl in eine Variable auslesen will, bekomme ich immer Null.

$f = fopen("test.dat", "rb");

$zahl = fread($f, 4);
settype($zahl, "int");

echo "Ausgelesen: ", $zahl;

fclose($f);

Das Problem ist wohl, dass PHP die 4 Bytes in einen String liest und dann diesen String umwandelt anstatt diese Bytes direkt als Zahl zu interpretieren. Ich hoffe ihr wisst wie ich's meine...wie kann ich die Zahl richtig auslesen???

  1. Hi,

    Ich habe eine Datei, die 4 Bytes mit der Hexadezimalen 11223344h zum Testen enthält (= normale Größe einer Integerzahl). Wenn ich nun aber diese Zahl in eine Variable auslesen will, bekomme ich immer Null.

    nein, Du versuchst nur, etwas völlig Falsches umzuwandeln.

    $zahl = fread($f, 4);

    Damit steht in Zahl ein String, bestehend aus vier Zeichen, von denen jedes im Bereich x00-xFF liegt. Die Wahrscheinlichkeit, dass eine Ziffer dabei ist, liegt pro Zeichen bei 10/256.

    settype($zahl, "int");

    Hier versuchst Du, einen String so zu interpretieren, dass dessen Ziffern und ggf. das "-"-Zeichen in eine Zahl umgewandelt werden.

    Das Problem ist wohl, dass PHP die 4 Bytes in einen String liest und dann diesen String umwandelt anstatt diese Bytes direkt als Zahl zu interpretieren.

    Richtig, da ist ja auch kein "direkt" gegeben.

    Ich hoffe ihr wisst wie ich's meine...wie kann ich die Zahl richtig auslesen???

    Die Bytewerte der vier Zeichen als Grundlage zur Berechnung der Zahl verwenden.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. OK danke, ich habs jetzt mal mit unpack gelöst:

      $f = fopen("test.dat", "rb");

      $zahl = fread($f, 4);
      $num = unpack("V1diezahl", $zahl);

      echo "Ausgelesen: ", $num["diezahl"];

      fclose($f);

      Also jetzt mal ganz ehrlich ich bin für die Einführung von C++ für Webseitenerstellung... (nicht zur Diskussion)

      1. Hallo,

        Also jetzt mal ganz ehrlich ich bin für die Einführung von C++ für Webseitenerstellung...

        [X] Dafür.

        Schönen Sonntag noch,
         Martin

        --
        Solange der Nagellack nicht trocken ist,
        ist eine Frau praktisch wehrlos.
          (Burt Reynolds, US-Schauspieler)
        1. Hallo,

          [X] Dafür.

          Das habe ich schonmal gesehen, was bedeutet das ???

          Gruß, Nils

          1. hi,

            [X] Dafür.

            Das habe ich schonmal gesehen, was bedeutet das ???

            Das ist die simple ASCII-Imitation einer Checkbox - die auch gleich angekreuzt wurde.

            [ ] Kapiert?

            gruß,
            wahsaga

            --
            /voodoo.css:
            #GeorgeWBush { position:absolute; bottom:-6ft; }
            1. Hallo,

              Aha, "Ich checke aus" quasi, versteh schon :-)

              Gruß, Nils

  2. hi,

    Ich habe eine Datei, die 4 Bytes mit der Hexadezimalen 11223344h zum Testen enthält (= normale Größe einer Integerzahl). Wenn ich nun aber diese Zahl in eine Variable auslesen will, bekomme ich immer Null.

    $f = fopen("test.dat", "rb");

    $zahl = fread($f, 4);
    settype($zahl, "int");

    Du suchst hexdec().

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. Äh soweit ich die hexdec-Dokumentation jetzt gesehen habe wandelt sie einen String (!) in einen Integerwert um. Allerdings enthält dieser String die Ziffern als ASCII-Zeichen, meine Zahl ist aber kein Text sondern eine binäre Variable.

      Trotzdem danke, ich habs ja gelöst :)

      1. hi,

        Allerdings enthält dieser String die Ziffern als ASCII-Zeichen, meine Zahl ist aber kein Text sondern eine binäre Variable.

        Sorry, da hatte ich dich falsch verstanden - ich dachte, "11223344h" wäre das,w as du aus der Textdatei liest.

        gruß,
        wahsaga

        --
        /voodoo.css:
        #GeorgeWBush { position:absolute; bottom:-6ft; }