Seite 1 von 1

Korrektes Vergleichen von hexadez. Werten in PHP?

Verfasst: 04.10.2008, 17:26
von Airport1
Wie vergleicht man denn KORREKT hexadezimale Werte in PHP?

angenommen ich habe einen string der das fuehrende 0x NICHT enthaelt. z.B.
$z = "fce2";

weiter angenommen ich habe dezimal 64738 und wandle dies in hex:
$a = dechex(64738);

gebe ich dies mit echo aus ist dies "fce2".
kann ich nun in php einfach auf $a == $z vergleichen?
welcher typ wuerde dann mit welchem typ verglichen?

ich kann dazu nix in der doku finden ;) eigentlich geht es sogar um einen vergleich der art:

if ($a >= $z1 && $a <= $z2) ...

moechte ungern erst wieder alles in dez. wandeln fuer den vergleich..

muss man ggf. erst wieder ein '0x' vorne anstellen, damit php rafft dass es sich um hex-werte handelt?

Verfasst:
von

Verfasst: 04.10.2008, 18:06
von Airport1
oder fuehrt bei einem groessenvergleich (also nicht einfach nur ==) kein weg an sowas vorbei wie u.g. code?

sei:
$dec = 64738 (dezimal)
$z1 = "fce0"; (hexadezimal - aber OHNE 0x)
$z2 = "fce4"; (hexadezimal - aber OHNE 0x)

dann:
if ($dec >= hexdec($z1) && $dec <= hexdec($z2)) {

Re: Korrektes Vergleichen von hexadez. Werten in PHP?

Verfasst: 04.10.2008, 20:05
von Mork vom Ork
Airport1 hat geschrieben:angenommen ich habe einen string der das fuehrende 0x NICHT enthaelt. z.B.
$z = "fce2";

weiter angenommen ich habe dezimal 64738 und wandle dies in hex:
$a = dechex(64738);

welcher typ wuerde dann mit welchem typ verglichen?
Vorsicht, du unterliegst da möglicherweise einem Denkfehler: Es gibt keine dezimalen und auch keine hexadezimalen Werte. Es gibt eine hexa-/dezimale Darstellung dieser Werte. Das ist ein wesentlicher Unterschied, und damit lautet dann auch die Antwort auf deine Frage: Es werden zwei Zeichenketten verglichen, keine Zahlen. Wenn du $z und $a mal mit var_dump() untersuchst, wird PHP dir "string" als Typ angeben. Das heißt, ob $z nun den Text "fce2" enthält oder "Anton", kommt beim Vergleich auf dasselbe raus.
if ($a >= $z1 && $a <= $z2) ...
Wenn du Zahlen vergleichen möchtest, solltest du auch Zahlen in den Variablen stehen haben, keine Zeichenketten. PHP bietet dazu die C-Funktion sscanf() an, der es freundlicherweise auch egal ist, ob der „Hex-Text“ mit 0x anfängt oder nicht.

$a = "0xa";
sscanf($a, "%x", $i);
var_dump($a);
var_dump($i);

Verfasst: 04.10.2008, 21:00
von Airport1
> Wenn du Zahlen vergleichen möchtest, solltest du auch Zahlen in den Variablen stehen haben, keine Zeichenketten.

fuer mich ist fce2 eine zahl, eben in hexadez. darstellung. allerdings dachte ich mir schon dass php das intern nur als string ablegt.

in anderen sprachen hab ich durchaus die moeglichkeit hex-werte miteinander DIREKT zu vergleichen, aber in php geht das wohl nur DIREKT bei == da ja "fce2" das selbe wie "fce2" waere, auch wenn dann eigentlich nur einen String-Vergleich durchfuehrt..

D.h. also es gibt keine native Methode in PHP um HEX-werte DIREKT auf >= und <= zu pruefen, man muss erst in dezimal zurueckwandeln (oder sscanf nutzen..)? Schade .)

PS: Sorry wenn ich Hex-Werte sage, das ist mir so anheim seit jungen Jahren. Das kann man mir eh nicht mehr abgewoehnen, auch wenn es semantisch vielleicht nicht so ganz stimmen mag ;-)

Verfasst: 04.10.2008, 21:33
von Mork vom Ork
Airport1 hat geschrieben:in anderen sprachen hab ich durchaus die moeglichkeit hex-werte miteinander DIREKT zu vergleichen
Da ist mir so auf den Dutt keine bekannt, welche sind denn das? Verwechsle das nicht mit der Darstellung im Code! Etwas wie

$a = 0xf;
$b = 15;
if ($a == $b) {
echo "Gleich";
}

funktioniert in PHP wie in so ziemlichen allen anderen Sprachen ja auch und gibt korrekt "Gleich" aus. Das Problem tritt nur auf, wenn die Zahl „von draußen“ kommt, meinetwegen aus einer Datei, denn dann liegt 0xf ja als Zeichenkette vor. Im Programmcode wandelt der Parser um, liest man selbst, muss man auch selbst umwandeln.

Die automatische Typkonvertierung hat sicher einen nicht zu unterschätzenden Bequemlichkeitsvorteil, aber grundsätzlich stehe ich dem etwas skeptisch gegenüber. Denn was ist beef, Fleisch oder 48879? ;)
D.h. also es gibt keine native Methode in PHP um HEX-werte DIREKT auf >= und <= zu pruefen, man muss erst in dezimal zurueckwandeln (oder sscanf nutzen..)?
Wenn du schon umwandelst, solltest du gleich mit sscanf() o.ä. in einen Integer-Wert umwandeln, anstatt nur die Darstellung in der Zeichenkette zu ändern. Ist sauberer.
Sorry wenn ich Hex-Werte sage, das ist mir so anheim seit jungen Jahren.
Ist ja nicht direkt falsch, und ich sag's auch. Man darf nur nicht vergessen, dass man immer mit Zeichenketten hantiert, egal ob es ein Hex-, ein Dezimal-, ein Oktal- oder ein Binärwert/-zahl ist. Nicht umsonst gibt es als Variablentyp immer nur integer oder string, nie „hex“, „binary“ oder dergleichen. Ich hab' schon einige Leute über dieses verflixte Detail stolpern sehen ;)