TS: Datentypen in PHP 32 Bit

Hello,

kleines Problem:

Netmask Bin: 11111111000000000000000000000000
Netmask: 255.0.0.0

## funktioniert bei Reg32 nicht  
##echo 'Netmask v4: ' . long2ip(decbin($net_mask_bin_str)) . PHP_EOL;

Da wird $net_mask_bin_str dann leider in float umgewandelt, was long2ip() dann nicht verkraftet. Kann ich den Float irgendwie vermeiden?

Würg-Around gibt es zwar schon, aber ist ja vielleicht unnötig?

   $_net32_bin[0] = substr($net_mask_bin_str, 0, 8);
   $_net32_bin[1] = substr($net_mask_bin_str, 8, 8);
   $_net32_bin[2] = substr($net_mask_bin_str, 16, 8);
   $_net32_bin[3] = substr($net_mask_bin_str, 24, 8);
   
   $netmask_ipstr = implode('.', array_map('bindec', $_net32_bin));

Im 64-Bit-System funktioniert es, weil da der Überlauf noch weit entfernt ist.

Glück Auf
Tom vom Berg

--
Es gibt nichts Gutes, außer man tut es!
Das Leben selbst ist der Sinn.
  1. Hallo TS,

    auf der PHP.NET Seite zu long2ip steht so ein blöder Tipp - man solle den Input für long2ip einfach nach float casten. Das ist Nonsense, damit funktioniert es dann konsequent gar nicht mehr.

    A-bär, andersrum gecastet wird's was:

    $ip = long2ip((int)bindec($bitString));

    Gerade mit PHP 7.3 32bit probiert. Funktioniert 1:1 identisch unter 32- und 64-bit PHP.

    Rolf

    --
    sumpsi - posui - obstruxi
    1. Hello Rolf,

      vielen Dank für's Testen.

      auf der PHP.NET Seite zu long2ip steht so ein blöder Tipp - man solle den Input für long2ip einfach nach float casten. Das ist Nonsense, damit funktioniert es dann konsequent gar nicht mehr.

      A-bär, andersrum gecastet wird's was:

      $ip = long2ip((int)bindec($bitString));

      Gerade mit PHP 7.3 32bit probiert. Funktioniert 1:1 identisch unter 32- und 64-bit PHP.

      Das tuts auf dem alten System auch nicht.

      Register: 11111111111111111111111111111111
      Registerbreite: 32
      PHP-Version: 7.2.6
      

      Dabei kommt entweder false heraus oder eine Fehlermeldung, dass ip2log() kein Float mag. Und das ganz unabhängig davon, ob ich mit (int) caste, oder nicht.

      Das Ganze scheint auch noch zufallsabhängig zu sein.

      Da bleibt der Würger eben drin.

      Ich weiß nicht, wo die Klasse nachher landet, und da sie ja unter Berücksichtigung dieser Seiteneffekte eigentlich nicht von 64 Bit abhängig sein muss, machen die paar Zeilen dann auch nichts mehr aus.

      Ich hatte das schon auf 64 Bit fertig und bekam es mit Anmerkungen zurück.

      Glück Auf
      Tom vom Berg

      --
      Es gibt nichts Gutes, außer man tut es!
      Das Leben selbst ist der Sinn.
      1. Hallo TS,

        Das Ganze scheint auch noch zufallsabhängig zu sein.

        Bestimmt nicht. Du kennst höchstens die Einflussgrößen nicht.

        Dabei kommt entweder false heraus oder eine Fehlermeldung, dass ip2log() kein Float mag.

        Hä? Wieso auf einmal ip2long? (Ich nehme an, das ip2log war ein Typo). Der ist sogar noch unproblematischer. Du haust ihm eine IP mit erstem Wert > 127 rein und er gibt Dir eine negative Zahl zurück. Und decbin schluckt sie anstandslos.

        Und wenn das mit ip2long jetzt ein Irrtum war und Du long2ip meintest, dann hast Du beim casten was falsch gemacht. In long2ip((int)$xyz) darf long2ip kein Float bekommen. Ich hatte noch ein PHP 5.6 auf meiner Dose, 32-bittig, selbst da funktioniert das.

        long2ip(-1) muss "255.255.255.255" erzeugen. Und das casten eines Wertes größer als INT_MAX, aber kleiner als 2^32, gibt einen negativen integer.

        Rolf

        --
        sumpsi - posui - obstruxi
        1. Hello Rolf,

          Das Ganze scheint auch noch zufallsabhängig zu sein.

          Bestimmt nicht. Du kennst höchstens die Einflussgrößen nicht.

          Die saß mal wieder vor dem Monitor...

          Dabei kommt entweder false heraus oder eine Fehlermeldung, dass ip2long() kein Float mag.

          Warning:  long2ip() expects parameter 1 to be integer, float given in [...] on line 72
          

          Hä? Wieso auf einmal ip2long? (Ich nehme an, das ip2long war ein Typo).

          Yes Sir! Blöder ging's nicht. Nachdem ich die Zeile mit long2ip() rausgeschmissen hatte und Du mir versichert hattest, dass es mit (int) doch funktionieren müsste, habe ich sie wieder reingetippt, leider mit ip2long().

          Nun geht es doch, so wie erwartet:

          var_dump($netmask_ip4_str = long2ip((int)bindec($net32_bin))) . PHP_EOL;
          
          ## Ausgabe
          # string(9) "255.0.0.0"
          

          Siebenmal kontrolliert und achtmal falsch geguckt :-O

          Ich konnte jetzt die ganze Nacht nicht schlafen in der Ungewissheit, so einen Blödsinn gecodet zu haben ...

          Glück Auf
          Tom vom Berg

          --
          Es gibt nichts Gutes, außer man tut es!
          Das Leben selbst ist der Sinn.
          1. Hallo TS,

            Ich konnte jetzt die ganze Nacht nicht schlafen in der Ungewissheit, so einen Blödsinn gecodet zu haben ...

            tröst

            Das passiert auch den Besten schon mal.

            Rolf

            --
            sumpsi - posui - obstruxi