lixx: Hex-Werte

Hallo liebe Leute!

Ich experementiere an einer Funktion die eine variable Anzahl an Parametern hat. Der letzte Parameter soll dabei ein Options-Argument sein. Um diesen von den anderen unterscheiden zu können, möchte ich Hexadezimal-Werte (wegen den '0x') für die Optionen verwenden. Dabei habe ich ein paar Schwierigkeiten mit der Berechnung. Hier als Beispiel sind es Variablen, in der Funktion später werden Konstanten verwendet.

$o1 = '0x01'; // 1
$o2 = '0x02'; // 2
$o3 = '0x04'; // 4
$o4 = '0x08'; // 8
$o5 = '0x10'; // 16

$o = $o1 | $o5;
echo hexdec($o); // gibt 17 aus: richtig

$o = $o2 | $o5;
echo hexdec($o); // gibt 18 aus: richtig

$o = $o1 | $o2 | $o3;
echo hexdec($o); // gibt 7 aus: richtig

$o = $o3 | $o4 | $o5;
echo hexdec($o); // gibt 1 aus: falsch, sollte 28 sein

$o = $o1 | $o2 | $o3 | $o4 | $o5;
echo hexdec($o); // gibt 1 aus: falsch, sollte 31 sein

Es kann jetzt natürlich sein, dass das prefix '0x' diesen Wurst verursacht, aber warum funzt es dann manchmal überhaupt?

Könnt ihr mir dabei bitte behilflich sein?

lg lixx

  1. Hallo lixx,

    $o1 … $o5 sind Strings. In den nächsten Zeilen benutzt Du Bitoperatoren auf Strings. Von diesen Ergebnissen glaubst Du, dass sie hexadezimale Strings sind und wandelst Sie dort in Dezimalzahlen um.

    Was Du wahrscheinlich möchtest, ist, dass $o1 … $o5 schon Integerzahlen sind. Also kannst Du entweder

    $o1 = hexdec('10');

    oder

    $o1 = 0x10;

    benutzen. Die hexdec()-Funktion in den echo-Statements fallen dann weg, denn Integerzahlen werden ja per default als Dezimalzahlen ausgegeben.

    Schöne Grüße,
    Olaf

    1. Hallo Olaf!

      $o1 … $o5 sind Strings. In den nächsten Zeilen benutzt Du Bitoperatoren auf Strings. Von diesen Ergebnissen glaubst Du, dass sie hexadezimale Strings sind und wandelst Sie dort in Dezimalzahlen um.

      Ich dachte schon, dass es daran liegen könnte. Aber hatte noch Hoffnung, da es einige male funzte. Ich war nur auf der Suche nach einer Möglichkeit den letzten Parameter von den anderen unterscheidbar zu machen. Um festzustellen ob dieser gesetzt wurde oder nicht, da die Argumente davor ebenfalls Strings oder Intergre sein können.

      lg lixx

      1. Hallo lixx,

        Vielleicht ist es günstiger, wenn Du die Parameterreihenfolge vertauschst, so dass der Parameter nicht an  der letzten, sondern an einer bekannten (1,. 2., 3. …) Stelle steht. Falls der Parameter optional ist, könntest Du dort entweder einen Wert oder null übergeben.

        Gruß
        Olaf

        1. Vielleicht ist es günstiger, wenn Du die Parameterreihenfolge vertauschst, so dass der Parameter nicht an  der letzten, sondern an einer bekannten (1,. 2., 3. …) Stelle steht. Falls der Parameter optional ist, könntest Du dort entweder einen Wert oder null übergeben.

          Soetwas wollte ich eben vermeiden. Ich werde es jetzt so lösen, dass eine Option gesetzt sein muss. Eigentlich hat die letzte Option, falls sie nicht gesetzt wird, sowieso einen default-Wert. Und diesen setzte ich dann.

          lg lixx