Я хочу напечатать шестнадцатеричные значения каждого из символов в строке PHP. Например, я хочу отобразить шестнадцатеричные значения каждого символа в строке, где я пытаюсь установить четвертый символ в Control-C (0x03).
$str=sprintf('ab1%c',0x03);
for ($cnt=0; $cnt<4; $cnt++)
{
$chr=$str[$cnt];
echo '$str['.$cnt.'] = "'.$str[$cnt].'" = '.sprintf('0x%02x',$chr[0])."\n";
}
var_dump(str_split($str));
Что я получаю, это:
$str[0] = "a" = 0x00
$str[1] = "b" = 0x00
$str[2] = "1" = 0x01
$str[3] = "" = 0x00
array(4) {
[0]=>
string(1) "a"[1]=>
string(1) "b"[2]=>
string(1) "1"[3]=>
string(1) ""}
Кажется, что $chr
это строка а не персонаж а также sprintf()
печатает целочисленное значение строки — ноль — вместо целочисленного значения одного символа.
Возможно ли сделать это на PHP? Я был уверен, что есть способ …
Согласно комментарию @ MarkBaker, решение заключается в использовании ord()
чтобы получить значение персонажа:
$str=sprintf('ab1%c',0x03);
for ($cnt=0; $cnt<4; $cnt++)
{
$chr=$str[$cnt];
echo '$str['.$cnt.'] = "'.$str[$cnt].'" = '.sprintf('0x%02x',ord($chr))."\n";
}
var_dump(str_split($str));
дает ожидаемые результаты:
$str[0] = "a" = 0x61
$str[1] = "b" = 0x62
$str[2] = "1" = 0x31
$str[3] = "" = 0x03
array(4) {
[0]=>
string(1) "a"[1]=>
string(1) "b"[2]=>
string(1) "1"[3]=>
string(1) ""}
PHP не имеет тип char (символьный). Вы правы, что в результате вы получаете 1-символьную строку.