Эквивалент PHP fseek() для переменных?

Мне нужен эквивалент функции PHP fseek(). Функция работает с файлами, но у меня есть переменная, содержащая бинарные данные, и я хочу с ней поработать. Я знаю, что мог бы использовать substr(), но это было бы неубедительно — оно используется для строк, а не для двоичных данных. Кроме того, создание файла, а затем использование fseek() - это не то, что я ищу.

Может быть, что-то построено с потоками?

РЕДАКТИРОВАТЬ: Хорошо, я почти там:

$data = fopen('data://application/binary;binary,'.$bin,'rb');

Предупреждение: не удалось открыть поток: rfc2397: недопустимый параметр


person Tower    schedule 12.06.2009    source источник
comment
Я не понимаю, почему бы не использовать substr(). Сталкивались ли вы с какими-либо проблемами при его использовании?   -  person Ionuț G. Stan    schedule 12.06.2009


Ответы (3)


Кай:

Вы почти сами себе ответили здесь. Потоки — вот ответ. Следующая запись вручную будет полезна: http://us.php.net/manual/en/wrappers.data.php

По сути, это позволяет вам передавать произвольные данные функциям обработки файлов PHP, таким как fopen (и, следовательно, fseek).

Тогда вы можете сделать что-то вроде:

<?php

$data = fopen('data://mime/type;encoding,' . $binaryData);

fseek($data, 128);
?>
person aaronmccall    schedule 12.06.2009
comment
Это будет работать при условии, что в php.ini включена функция allow_url_fopen. - person Ionuț G. Stan; 12.06.2009
comment
Код недействителен. Конструкция кажется неправильной. Я поставил режим «rb», но первая часть кажется неправильной. не удалось открыть поток: rfc2397: недопустимый параметр в - person Tower; 12.06.2009

fseek для данных в переменной не имеет смысла. fseek просто позиционирует дескриптор файла по указанному смещению, поэтому следующий вызов fread начинает чтение с этого смещения. Для строк не существует эквивалента fread.

Что не так с substr()?

С файлом вы бы сделали:

$f = fopen(...)
fseek($f, offset)
$x = fread($f, len)

с подстрокой:

$x = substr($var, offset, len)
person Craig    schedule 12.06.2009
comment
Это очень медленно. Я имею дело с большими двоичными файлами. Substr() предназначалась не для этого. - person Tower; 12.06.2009
comment
Теперь я смущен. Бинарные данные в файле или в переменной php. Если файл, почему бы не использовать fseek? - person Craig; 12.06.2009
comment
Извиняюсь. Данные взяты из файла, который он получает при передаче (а не в форме загрузки — я мог бы искать временный файл, а не файловую систему — я не могу использовать fseek или не имеет смысла создавать файлы для этого). - person Tower; 12.06.2009

Я предполагаю, но, возможно, запрашивается способ доступа к байтам в переменной с помощью указателя.. (используя его как массив байтов, как вы могли бы сделать в c - без накладных расходов памяти на размещение данных в массивах php) и иметь возможность редактировать их на месте без накладных расходов на копирование данных.

Неспособность сделать это является БОЛЬШОЙ проблемой, но если операционная система хорошо кэширует данные диска, использование fseek для временного файла может быть обходным путем.

person Michael    schedule 09.08.2011