Pergunta

O que eu preciso é um equivalente para a função fseek() do PHP. A função funciona em arquivos, mas eu tenho uma variável que contém dados binários e quero trabalhar sobre ela. Eu sei que eu poderia usar substr(), mas isso seria coxo - é usado para cordas, não para dados binários. Além disso, a criação de um arquivo e, em seguida, usando fseek() não é o que eu estou procurando qualquer um.

Talvez algo construído com streams?

EDIT: Ok, eu estou quase lá:

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

Aviso: falha ao fluxo aberto: rfc2397: parâmetro ilegal

Foi útil?

Solução

Kai:

Você quase respondeu a si mesmo aqui. Streams são a resposta. A seguir, a entrada manual será esclarecedor: http://us.php.net/manual /en/wrappers.data.php

É essencialmente permite que você passar dados arbitrários para arquivo funções de manipulação de PHP, como fopen (e, portanto, fseek).

Em seguida, você poderia fazer algo como:

<?php

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

fseek($data, 128);
?>

Outras dicas

fseek em dados em uma variável não faz sentido. fseek apenas posiciona o identificador de arquivo para o deslocamento especificado, então as próximas partidas chamada fread a leitura de que compensado. Não há equivalente a fread para strings.

errada O que acontece com substr ()?

Com um arquivo que você faria:

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

com substr:

$x = substr($var, offset, len)

Eu estou supondo, mas talvez o que está sendo solicitado é uma forma de acesso bytes em uma variável usando um ponteiro .. (usando-o como uma matriz de bytes como você poderia fazer em c - sem a sobrecarga de memória de colocar os dados em matrizes PHP) e ser capaz de editá-los iNPLACE sem a sobrecarga de copiar os dados.

Não ser capaz de fazer isso é um grande problema, mas se o sistema operacional armazena em cache dados do disco bem usando fseek em um arquivo temporário pode ser uma solução alternativa.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top