Вопрос

Мне нужен эквивалент 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 для временного файла может быть обходным решением.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top