В PHP, если у вас есть переменная с двоичными данными, как вы получаете конкретные байты из данных? Например, если у меня есть данные длиной 30 байтов, как я могу получить первые 8 байтов?
Прямо сейчас, я рассматриваю его как строку, используя функцию substr()
:
$data = //... $first8Bytes = substr($data, 0, 8);
Можно ли использовать substr
с двоичными данными?
Или есть другие функции, которые я должен использовать?
Как правило, все строковые функции в 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 (), чтобы манипулировать «реальными» байтами