Как преобразовать массив байтов в строку в PHP?

У меня есть массив байтов, который я бы хотел сопоставить с их эквивалентами ASCII.

Как я могу это сделать?

Ответы

Ответ 1

Если по массиву байтов вы имеете в виду:

$bytes = array(255, 0, 55, 42, 17,    );

array_map()

Тогда это так же просто, как:

$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-метод обхода проблемы:

$str = call_user_func_array("pack", array_merge(array("C*"), $bytes)));

Эта конструкция также более полезна, если вам может потребоваться переключиться с байтов C * (для строк ASCII) на слова S * (для UCS2) или даже иметь список из 32-битных целых чисел L * (например, строка Unicode UCS4).

Ответ 2

Еще один способ:

$str = vsprintf(str_repeat('%c', count($bytes)), $bytes);

Ура!

Ответ 3

Mario имеет уже наилучший вариант, но вот более экзотический способ достичь это.

$str = call_user_func_array(
        'sprintf',
        array_merge((array) str_repeat('%c', count($bytes)), $bytes)
       );

CodePad.

Ответ 4

Поправляя ответ mario для использования pack(): Начиная с PHP 5.5, вы можете использовать распаковку Argument через ...

$str = pack('C*', ...$bytes);

Другие функции удобны для использования, но предпочтительно иметь читаемый код.