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

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

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

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

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

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

Ответы

Ответ 1

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

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

Ответ 2

Если установлено расширение 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

Ответ 3

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

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

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