Байт-манипуляция в PHP

В PHP, если у вас есть переменная с двоичными данными, как вы получаете конкретные байты из данных? Например, если у меня есть данные длиной 30 байтов, как я могу получить первые 8 байтов?

Прямо сейчас, я рассматриваю его как строку, используя функцию substr() :

 $data = //... $first8Bytes = substr($data, 0, 8); 

Можно ли использовать substr с двоичными данными?

Или есть другие функции, которые я должен использовать?

Solutions Collecting From Web of "Байт-манипуляция в PHP"

Как правило, все строковые функции в PHP безопасны для использования с необработанными байтами. Проблема, которая в основном возникает, равна null-байтам, но только для файловых систем: http://php.net/manual/en/security.filesystem.nullbytes.php

Ваш substr() отлично подходит для использования с двоичными строками. Некоторые другие функции, такие как strtok и ereg однако, ereg с C, где символ «\ 0» становится проблемой.

Если расширение mbstring установлено, а перегрузка mbstring включена, то использование substr может вызвать проблемы. Перегрузка Mbstring приведет к тому, что mb_substr будет автоматически вызываться каждый раз, когда вызывается substr (если установлена ​​mbstring и перегрузка mbstring отключена , то substr будет правильно извлекать байты). Следующий код будет использовать mb_substr если mbstring будет установлен, а substr если нет. Используется кодировка символов «8 бит», которая обрабатывает каждый символ как 1 байт и игнорирует нулевые терминаторы ('\ 0').

 if (function_exists('mb_substr')) { $bytes = mb_substr($string, 0, 8, '8bit'); } else { $bytes = substr($string, 0, 8); } 

Благодаря ircmaxell

Звучит неплохо, поскольку PHP обрабатывает строки (внутренне) «как« C char * (1byte = 1char)

С другой стороны, это может быть нарушено, если строка находится в кодировке Unicode (2 байта = 1 символ)

nb: Вы также можете играть с pack () и unpack (), чтобы манипулировать «реальными» байтами