Эквивалент PHP fseek() для переменных?
Вопрос
Мне нужен эквивалент PHP fseek()
функция.Функция работает с файлами, но у меня есть переменная, содержащая двоичные данные, и я хочу с ней работать.Я знаю, что мог бы использовать substr()
, но это было бы глупо — оно используется для строк, а не для двоичных данных.Кроме того, создание файла и последующее использование fseek()
это тоже не то, что я ищу.
Может быть, что-то построенное из потоков?
РЕДАКТИРОВАТЬ:Хорошо, я почти у цели:
$data = fopen('data://application/binary;binary,'.$bin,'rb');
Предупреждение:не удалось открыть поток:rfc2397:недопустимый параметр
Решение
Кай:
Вы почти ответили себе здесь.Потоки — это ответ.Следующая запись вручную будет полезной: http://us.php.net/manual/en/wrappers.data.php
По сути, это позволяет вам передавать произвольные данные в функции обработки файлов PHP, такие как fopen (и, следовательно, fseek).
Тогда вы могли бы сделать что-то вроде:
<?php
$data = fopen('data://mime/type;encoding,' . $binaryData);
fseek($data, 128);
?>
Другие советы
fseek для данных в переменной не имеет смысла.fseek просто позиционирует дескриптор файла по указанному смещению, поэтому следующий вызов fread начинает чтение с этого смещения.Для строк не существует эквивалента fread.
Что не так с substr()?
С файлом вы бы сделали:
$f = fopen(...)
fseek($f, offset)
$x = fread($f, len)
с подстркой:
$x = substr($var, offset, len)
Я предполагаю, но, возможно, речь идет о способе доступа к байтам в переменной с помощью указателя.(используя его как массив байтов, как вы могли бы сделать в c - без затрат памяти на размещение данных в массивах php) и возможность редактировать их на месте без затрат на копирование данных.
Невозможность сделать это — БОЛЬШАЯ проблема, но если операционная система хорошо кэширует данные диска, использование fseek для временного файла может быть обходным решением.