У меня есть массив байтов, который я хотел бы сопоставить с их эквивалентами ASCII.
Как я могу это сделать?
Если по массиву байтов вы имеете в виду:
$bytes = array(255, 0, 55, 42, 17, );
Тогда это так просто:
$string = implode(array_map("chr", $bytes));
Какая компактная версия:
$string = ""; foreach ($bytes as $chr) { $string .= chr($chr); } // Might be a bit speedier due to not constructing a temporary array.
Но наиболее целесообразной альтернативой может быть использование pack("C*", [$array...])
, хотя для передачи целочисленного списка требуется PHP-метод обхода в PHP:
$str = call_user_func_array("pack", array_merge(array("C*"), $bytes)));
Эта конструкция также более полезна, если вам может потребоваться переключиться с байтов C * (для строк ASCII) на слова S * (для UCS2) или даже иметь список из 32-битных целых чисел L * (например, строку Unicode UCS4).
Еще один способ:
$str = vsprintf(str_repeat('%c', count($bytes)), $bytes);
Ура!
Марио уже наилучшим образом подойдет , но вот более экзотический способ добиться этого.
$str = call_user_func_array( 'sprintf', array_merge((array) str_repeat('%c', count($bytes)), $bytes) );
CodePad .
Поправляя ответ марио для использования pack()
: Начиная с PHP 5.5, вы можете использовать распаковку Argument через ...
$str = pack('C*', ...$bytes);
Другие функции удобны для использования, но предпочтительно иметь читаемый код.