2009-06-12 16 views
0

Ce dont j'ai besoin est un équivalent pour la fonction fseek() de PHP. La fonction fonctionne sur les fichiers, mais j'ai une variable qui contient des données binaires et je veux travailler dessus. Je sais que je pourrais utiliser substr(), mais ce serait boiteux - il est utilisé pour les chaînes, pas pour les données binaires. Aussi, créer un fichier et ensuite utiliser fseek() n'est pas ce que je cherche non plus.PHP fseek() équivalent pour les variables?

Peut-être quelque chose construit avec des flux?

EDIT: D'accord, je suis presque:

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

Attention: failed to open stream: RFC2397: paramètre illégal

+0

Je ne vois pas pourquoi ne pas utiliser substr(). Avez-vous rencontré des problèmes pour l'utiliser? –

+0

Oui, c'est lent. – Tower

Répondre

5

Kai:

Vous avez presque répondu vous-même ici. Les flux sont la réponse. L'entrée manuelle suivante sera éclairante: http://us.php.net/manual/en/wrappers.data.php

Il vous permet essentiellement de transmettre des données arbitraires aux fonctions de gestion de fichiers de PHP telles que fopen (et donc fseek).

Ensuite, vous pouvez faire quelque chose comme:

<?php 

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

fseek($data, 128); 
?> 
+0

Cela fonctionnera à condition que allow_url_fopen soit activé dans php.ini –

+0

Le code n'est pas valide. La construction semble être fausse. J'ai mis le mode 'rb', mais la première partie semble être erronée. "n'a pas réussi à ouvrir le flux: rfc2397: paramètre illégal dans" – Tower

+0

Voir http://www.faqs.org/rfcs/rfc2045.html pour les types autorisés –

2

fseek sur des données dans une variable n'a pas de sens. fseek positionne simplement le descripteur de fichier sur le décalage spécifié, de sorte que l'appel fread suivant commence à lire à partir de ce décalage. Il n'y a pas d'équivalent de fread pour les cordes.

Quel est le problème avec substr()?

Avec un fichier que vous feriez:

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

avec substr:

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

C'est très lent. J'ai affaire à de gros fichiers binaires. Ce n'est pas ce à quoi substr() était destiné. – Tower

+0

Je suis confus maintenant. Est-ce que les données binaires sont dans un fichier ou dans une variable php? Si un fichier pourquoi ne pas utiliser fseek? – Craig

+0

Désolé. Les données proviennent d'un fichier obtenu à partir d'une transmission (pas un formulaire de téléchargement - je pourrais voir le fichier temporaire, pas le système de fichiers - je ne peux pas utiliser fseek ou n'a pas de sens pour créer des fichiers). – Tower

-1

Je devine, mais peut-être ce qui est demandé est un moyen d'accéder à des octets dans une variable par en utilisant un pointeur .. (en l'utilisant comme un tableau d'octets comme vous pourriez le faire en c - sans la surcharge de mémoire de mettre les données dans les tableaux php) et être capable de les éditer inplace sans la surcharge de la copie des données. Ne pas être capable de faire cela est un gros problème, mais si le système d'exploitation met en cache les données de disque bien en utilisant fseek sur un fichier temporaire pourrait être une solution de contournement.

+0

déjà dit fseek n'est pas ce que l'affiche recherche. – franka