Я в полном недоумении, пытаясь преобразовать десятичную строку, а не октаву, просто обычное десятичное число, которое варьируется по количеству символов в обычный текст.
Строка будет выглядеть так:
495051979899100 (123abcd)
Я мог бы использовать chr () весь день, если бы у меня был способ предсказать, что будет содержать строка, но я действительно не могу, так что мне делать?
Ваш вопрос неоднозначен в том смысле, что без каких-либо предположений входная строка может привести к экспоненциальному числу выходных строк, которые все удовлетворяют ограничениям.
Мы предполагаем, что под ASCII вы имеете в виду читаемые (не управляющие части) ascii. Таким образом, любое действительное значение ASCII находится между 32
а также 128
, В результате вы знаете, что если первые два символа представляют значение, строго меньше 32
это будет в 100+
спектр.
Ваш алгоритм должен делать две вещи одновременно:
32
затем значение находится в 100+
диапазон, так что прочитайте три символа и конвертируйте, если не в -100
Диапазон, так что конвертируйте два символа.Или в PHP:
$s = "495051979899100";
$n = strlen($s);
$result = "";
for ($x=0; $x<=$n; $x += 2) {
$temp = intval(substr($s,$x,2));
if($temp < 32) {
$temp = intval(substr($s,$x,3));
if($temp > 128) {
die "Assumption error";
}
$x++;
}
$result .= chr($temp);
}
echo $result;
Да, написал почти тот же код
$str = '495051979899100';
$ind = 0; $out = '';
while($ind < strlen($str))
{
$two = substr($str, $ind, 2);
if ($two >= 32) {
$out .= chr($two);
$ind += 2;
} else {
$out .= chr(substr($str, $ind, 3));
$ind += 3;
}
}
echo $out;
Мой модный способ с ограничением, что char может быть от 32 до 128.
$value = '495051979899100';
preg_match_all('/3[2-9]|[4-9][0-9]|1[0-1][0-9]|12[0-8]/', $value, $matches);
var_dump(implode(array_map('chr',$matches[0])));
// string(7) "123abcd"