разбил ты строку, а результат посмотри какой мне нуженОно, конечно.
Гуглится за 5 секунд, если что, я не знаю, что там гуглить часами.Код:$ php -r 'echo hex2bin("2cd2d948cfaf4b1097530f7c74fb6737");' | hexdump -C 00000000 2c d2 d9 48 cf af 4b 10 97 53 0f 7c 74 fb 67 37 |,..H..K..S.|t.g7|
$dump = preg_replace_callback(
'/
(?<utf8>
[\x09\x0A\x0D\x20-\x7E]
| [\xC2-\xDF][\x80-\xBF]
| \xE0[\xA0-\xBF][\x80-\xBF]
| [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}
| \xED[\x80-\x9F][\x80-\xBF]
| \xF0[\x90-\xBF][\x80-\xBF]{2}
| [\xF1-\xF3][\x80-\xBF]{3}
| \xF4[\x80-\x8F][\x80-\xBF]{2}
)
|
(?<trash>.)
/xs',
function (array $match) {
if (isset($match['utf8']) && strlen($match['utf8']) > 0) {
$char = $match['utf8'];
if (strlen($char) === 1 && ord($char) < 31) {
return '\x' . bin2hex($char);
} else {
return $char;
}
} else {
return '\x' . bin2hex($match['trash']);
}
},
hex2bin('2cd2d948cfaf4b1097530f7c74fb6737')
);
var_dump($dump);
Но наверняка можно как-то проще/эффективнее это сделать.string(34) ",\xd2\xd9HϯK\x10\x97S\x0f|t\xfbg7"
echo json_encode(hex2bin("2cd2d948cfaf4b1097530f7c74fb6737"),
JSON_INVALID_UTF8_IGNORE + JSON_INVALID_UTF8_SUBSTITUTE+JSON_PARTIAL_OUTPUT_ON_ERROR);
",H\u03efK\u0010S\u000f|tg7"
в питоне есть базовый тип данных - byte https://docs.python.org/3/library/stdtypes.html#bytesЯ так понял, ты говоришь не про bytes.fromhex(), а про какую-то внутреннюю функцию Python, которая так дампит бинарную строку в консоль.
Если она так дампит все не-UTF-8 последовательности и управляющие символы, то в целом интересная задача.
Ты просто вопроса не понял. Он хочет сдампить строку, как это делает Python:в питоне есть базовый тип данных - byte https://docs.python.org/3/library/stdtypes.html#bytes
нет никакой функции, это просто синтаксис "Any binary values over 127 must be entered into bytes literals using the appropriate escape sequence",
в php, java, golang, js и т.д. используется тип string
>>> bytes.fromhex('2cd2d948cfaf4b1097530f7c74fb6737')
b',\xd2\xd9H\xcf\xafK\x10\x97S\x0f|t\xfbg7'
Конечно:Но наверняка можно как-то проще/эффективнее это сделать.
function HexToPrintable($hex) {
return preg_replace_callback('/=(.{2})/',
function($matches) { return '\x' . strtolower($matches[1]); },
quoted_printable_encode(hex2bin($hex)));
}
print_r([HexToPrintable('2cd2d948cfaf4b1097530f7c74fb6737'), ',\xd2\xd9H\xcf\xafK\x10\x97S\x0f|t\xfbg7']);
/*
Array
(
[0] => ,\xd2\xd9H\xcf\xafK\x10\x97S\x0f|t\xfbg7
[1] => ,\xd2\xd9H\xcf\xafK\x10\x97S\x0f|t\xfbg7
)
*/
Ну это не совсем аналог. Твоя функция не тронет, например, 0xff, который не является валидным байтом для UTF-8 и в большинстве консолей отобразится как мусорный символ.Конечно:
PHP:function HexToPrintable($hex) { return preg_replace_callback('/=(.{2})/', function($matches) { return '\x' . strtolower($matches[1]); }, quoted_printable_encode(hex2bin($hex))); }
PHP:print_r([HexToPrintable('2cd2d948cfaf4b1097530f7c74fb6737'), ',\xd2\xd9H\xcf\xafK\x10\x97S\x0f|t\xfbg7']); /* Array ( [0] => ,\xd2\xd9H\xcf\xafK\x10\x97S\x0f|t\xfbg7 [1] => ,\xd2\xd9H\xcf\xafK\x10\x97S\x0f|t\xfbg7 ) */
одна проблема: у ТС на входе уже есть представление данных в виде hex-строки, ее уже можно записать в логТы просто вопроса не понял. Он хочет сдампить строку, как это делает Python:
Такой дамп удобен для каких-нибудь логов, чтобы мусором вывод не забивать.
В большинстве случаев никто не хочет видеть в логе «2cd2d948cfaf4b1097530f7c74fb6737», когда всего пара символов non-printable. А в большинстве случаев строки вообще могут отображаться как есть.одна проблема: у ТС на входе уже есть представление данных в виде hex-строки, ее уже можно записать в лог
Покажи hex-строку, которая обрабатывается неправильно.Твоя функция не тронет, например, 0xff, который не является валидным байтом для UTF-8 и в большинстве консолей отобразится как мусорный символ.
А результат у тебя, внезапно, такой же.разбил ты строку, а результат посмотри какой мне нужен
бинарную строку, идентичную той, которая в php получена через hex2bin. А такое представлениеВ ответ от этой функции мы получим
это просто результат вывода на экран стандартным Питоновским print-ом.b',\xd2\xd9H\xcf\xafK\x10\x97S\x0f|t\xfbg7
ffПокажи hex-строку, которая обрабатывается неправильно.
print_r([HexToPrintable('feff'), '\xfe\xff']);
/*
Array
(
[0] => \xfe\xff
[1] => \xfe\xff
)
*/