Du befindest Dich im Archiv vom ABAKUS Online Marketing Forum. Hier kannst Du Dich für das Forum mit den aktuellen Beiträgen registrieren.

Korrektes Vergleichen von hexadez. Werten in PHP?

Ajax, Hijax, Microformats, RDF, Markup, HTML, PHP, CSS, MySQL, htaccess, robots.txt, CGI, Java, Javascript usw.
Neues Thema Antworten
Airport1
PostRank 10
PostRank 10
Beiträge: 4489
Registriert: 16.08.2004, 18:50
Wohnort: Backnang / bei Stuttgart

Beitrag von Airport1 » 04.10.2008, 17:26

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?
Linktauschanfragen zwecklos
https://www.bot-trap.de/ Spamschutz fuer Webmaster - zentrale Meldestelle fuer Web Spam
https://www.airport1.de/blog/ Lombagruschd Blog mid Gardadierle
https://www.ranking-hits.de/ Counter & PR Service

Anzeige von ABAKUS

von Anzeige von ABAKUS »

SEO Consulting bei ABAKUS Internet Marketing
Erfahrung seit 2002
  • persönliche Betreuung
  • individuelle Beratung
  • kompetente Umsetzung

Jetzt anfragen: 0511 / 300325-0.


Airport1
PostRank 10
PostRank 10
Beiträge: 4489
Registriert: 16.08.2004, 18:50
Wohnort: Backnang / bei Stuttgart

Beitrag von Airport1 » 04.10.2008, 18:06

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)) {
Linktauschanfragen zwecklos
https://www.bot-trap.de/ Spamschutz fuer Webmaster - zentrale Meldestelle fuer Web Spam
https://www.airport1.de/blog/ Lombagruschd Blog mid Gardadierle
https://www.ranking-hits.de/ Counter & PR Service

Mork vom Ork
PostRank 9
PostRank 9
Beiträge: 2557
Registriert: 08.07.2008, 11:07
Wohnort: Aufm Friedhof.

Beitrag von Mork vom Ork » 04.10.2008, 20:05

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);

Airport1
PostRank 10
PostRank 10
Beiträge: 4489
Registriert: 16.08.2004, 18:50
Wohnort: Backnang / bei Stuttgart

Beitrag von Airport1 » 04.10.2008, 21:00

> 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 ;-)
Linktauschanfragen zwecklos
https://www.bot-trap.de/ Spamschutz fuer Webmaster - zentrale Meldestelle fuer Web Spam
https://www.airport1.de/blog/ Lombagruschd Blog mid Gardadierle
https://www.ranking-hits.de/ Counter & PR Service

Mork vom Ork
PostRank 9
PostRank 9
Beiträge: 2557
Registriert: 08.07.2008, 11:07
Wohnort: Aufm Friedhof.

Beitrag von Mork vom Ork » 04.10.2008, 21:33

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 ;)

Antworten
  • Vergleichbare Themen
    Antworten
    Zugriffe
    Letzter Beitrag