Šta je novo?

php char to hex

kraft

Cenjen
Učlanjen(a)
10.07.2009
Poruke
273
Poena
169
Problem je sledeci:

Imam jedan string karaktera, u pitanju je ceo ISO-8859-1, ali tamo gde izbija problem je u ovom delu: !"#$%&'()

Zelim da prebacim taj string karaktera u njihove hexadecimalne vrednosti i imam ovu liniju koda koja to radi:

Kod:
<?php
$string = "!\"#$%&'()";

$hex = preg_replace("/(.)/es", "sprintf(' %02X', ord('$1'))", $string);

echo $hex;

?>

Rezultat ovoga bi trebalo da bude u hexadecimalnom obliku:

Kod:
21 22 23 24 25 26 27 28 29

medjutim ja dobijam ovo:

Kod:
21 5C 23 24 25 26 27 28 29

Problem je u 5C koji je u stvari karakter / odnosno escape.

Zakljucak: umesto hexa kod za karakter " (22) dobio sam hexa kod za karakter / (5C). :(



Daljim mucenjem otkrio sam sledece, kada napisem preg_replace funkciju sa jednostrukim navodnicima umesto sa dvostrukim:

Kod:
<?php
$string = "!\"#$%&'()";

$hex = preg_replace('/(.)/es', 'sprintf(" %02X", ord("$1"))', $string);

echo $hex;

?>

Dobijam ovo:

Kod:
21 22 23 24 25 26 5C 28 29

Zakljucak: umesto hexa kod za karakter ' (27) dobio sam hexa kod za karakter / (5C). :( :(



Ne mogu da koristim ovako nesto:

Kod:
echo hexdec(ord($char));

Jer ovo radi samo sa ASCII, a meni treba full ISO-8859-1.

Nadam se da neko moze da mi pomogne da resim ovo.

Poz
 
Mozes ovako:

$string=array("!","\"","#","$","%","&","'","(",")");
foreach($string as $value){
$hex = bin2hex($value);
echo $hex." ";
 
U nedostatku vremena da smišljam bolje rešenje, evo jednog možda ne toliko efikasnog kao regex ali koje radi:

PHP:
for($i=0; $i<strlen($string); $i++){
    $hex = sprintf(' %02X', ord($string[$i]));
    echo $hex." ";
}

Ovo radi zato što se u PHP-u string može posmatrati i koristiti kao niz charova i članovima niza se može pristupati preko indeksa kao i bilo kom drugom nizu, tako da u tvom slučaju $string[0] vraća '!', $string[1] vraća '\', itd.

Kao što rekoh nemam vremena da istražujem ali čini mi se da tvoj kod ne radi zbog pattern modifiera "e"

http://www.php.net/manual/en/reference.pcre.pattern.modifiers.php je napisao(la):
e (PREG_REPLACE_EVAL)
If this modifier is set, preg_replace() does normal substitution of backreferences in the replacement string, evaluates it as PHP code, and uses the result for replacing the search string. Single quotes, double quotes, backslashes (\) and NULL chars will be escaped by backslashes in substituted backreferences.
 
Evo da odgovorim sam sebi, setio sam se boljeg rešenja :eyebrows:

PHP:
function stringToHex($match) {
    return sprintf(' %02X', ord($match[0]));
}
$hex= preg_replace_callback("/(.)/s", "stringToHex", $string);

preg_replace_callback funkcija dozvoljava da joj se prosledi callback funkcija koja će se izvršiti za svaki match, čime se izbegava veštačka evaluacija koda koju radi e modifier. Od PHP verzije 5.3 moguće je proslediti i anonimnu funkciju kao callback, što je efikasnije u slučaju da koristiš tu verziju, a to bi izgledalo ovako:

PHP:
$hex= preg_replace_callback("/(.)/s", function ($match) {
    return sprintf(' %02X', ord($match[0]));
}, $string);

:wave:
 
PHP:
function stringToHex($match) { 
    return sprintf(' %02X', ord($match[0])); 
} 
$hex= preg_replace_callback("/(.)/s", "stringToHex", $string);

Ovako sam i uradio na kraju, nisam 100% siguran na kakav server ce ici skripta, ovako je sigurnije.

Hvala u svakom slucaju.

Poz
 
Nazad
Vrh Dno