bytes.fromhex() в PHP

Вурдалак

Продвинутый новичок
PHP:
print_r([HexToPrintable('feff'), '\xfe\xff']);
/*
Array
(
    [0] => \xfe\xff
    [1] => \xfe\xff
)
*/
Получается так.
А как должно быть?
А, да, я не прав по поводу 0xff.
Там UTF-8 вообще не отобразится как есть:
PHP:
HexToPrintable(bin2hex("тест"))
Код:
xd1\x82\xd0\xb5\xd1\x81\xd1\x82
В то время как у меня будет «тест».
 

ksnk

прохожий
Ну, блин. Действительно, проще самому написать.
PHP:
function dumpPrintable($str){
    $result='';
    for($i=0;$i<strlen($str);$i++){
        $c=ord($str{$i});
        if($c>=32 && $c<127){
            $result.=chr($c);
        } else if($c<16){
            $result.='\x0'.dechex($c);
        } else {
            $result.='\x'.dechex($c);
        }
    }
    return "b'".$result."'";
}

echo dumpPrintable(hex2bin('2cd2d948cfaf4b1097530f7c74fb6737'))."<br>\n";
echo dumpPrintable('\xfe\xff')."<br>\n";
P.S. изменил.
 
Последнее редактирование:

AnrDaemon

Продвинутый новичок
Что за бред… Кто тебя так учил программы писать? Кто тебя так учил работать со строками вообще?… А про то, что 0x7f это непечатный символ, ты, видимо, вообще забыл?
 

S.Chushkin

Пофигист
А, да, я не прав по поводу 0xff.
Там UTF-8 вообще не отобразится как есть:
...
В то время как у меня будет «тест».
Ну да, там 8-и битная строка.
Если нужно именно UTF-8, то можно использовать особенность preg_***.
Для валидного UTF-8 будет что-то вроде:
PHP:
function UtfToPrintable($str) {
  return preg_replace_callback('/[\pZ\pC]/u', function($m) { return '\x' . bin2hex($m[0]); }, $str);
}
PHP:
$s = "\x09Вася\x10";
print_r([$s, UtfToPrintable($s)]);
/*
Array
(
    [0] =>     Вася
    [1] => \x09Вася\x10
)
*/
Для невалидного - немного сложнее.
 

Вурдалак

Продвинутый новичок
Ну да, там 8-и битная строка.
Если нужно именно UTF-8, то можно использовать особенность preg_***.
Для валидного UTF-8 будет что-то вроде:
PHP:
function UtfToPrintable($str) {
  return preg_replace_callback('/[\pZ\pC]/u', function($m) { return '\x' . bin2hex($m[0]); }, $str);
}
PHP:
$s = "\x09Вася\x10";
print_r([$s, UtfToPrintable($s)]);
/*
Array
(
    [0] =>     Вася
    [1] => \x09Вася\x10
)
*/
Для невалидного - немного сложнее.
Ну, в этом и был мой вопрос. Можно ли регулярно сократить для невалидного случая.
 

fixxxer

К.О.
Партнер клуба
в школе учиться надо было - узнал бы разницу между данными и форматом представления данных
Вот, мы с @grigori угадали. А вы тут развели спортивное программирование на две страницы.

 
Сверху