Байт-манипуляция в 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(), чтобы манипулировать "реальными" байтами