2009-06-12 10 views
0

Was ich brauche, ist ein Äquivalent für PHP fseek() Funktion. Die Funktion arbeitet mit Dateien, aber ich habe eine Variable, die binäre Daten enthält und ich möchte daran arbeiten. Ich weiß, ich könnte substr() verwenden, aber das wäre lahm - es wird für Strings verwendet, nicht für Binärdaten. Auch das Erstellen einer Datei und dann die Verwendung von fseek() ist nicht das, wonach ich suche.PHP fseek() äquivalent für Variablen?

Vielleicht etwas mit Streams gebaut?

EDIT: Okay, ich bin fast da:

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

Warnung: failed to open stream: rfc2397: illegale Parameter

+0

Ich sehe nicht, warum nicht substr() verwenden. Haben Sie bei der Verwendung Probleme festgestellt? –

+0

Ja, es ist langsam. – Tower

Antwort

5

Kai:

Sie haben fast beantwortet dich hier. Streams sind die Antwort. Der folgende manuelle Eintrag wird aufschlussreich sein: http://us.php.net/manual/en/wrappers.data.php

Im Wesentlichen erlaubt es Ihnen, beliebige Daten zu PHP-Dateihandhabungsfunktionen wie fopen (und damit fseek) zu übergeben.

Dann könnten Sie so etwas wie:

<?php 

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

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

Dies funktioniert, vorausgesetzt, dass allow_url_fopen in php.ini aktiviert ist –

+0

Der Code ist ungültig. Das Konstrukt scheint falsch zu sein. Ich habe den 'rb' Modus eingestellt, aber der erste Teil scheint irgendwie falsch zu liegen. "Fehler beim Öffnen des Streams: rfc2397: unzulässiger Parameter in" – Tower

+0

Siehe http://www.faqs.org/rfcs/rfc2045.html für erlaubte Typen –

2

fseek auf Daten in einer Variablen keinen Sinn macht. fseek positioniert das Datei-Handle einfach auf den angegebenen Offset, sodass der nächste fread-Aufruf beginnt, von diesem Offset zu lesen. Es gibt kein Äquivalent von fread für Strings.

Was ist falsch mit substr()?

Mit einer Datei würden Sie tun:

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

mit substr:

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

Das ist sehr langsam. Ich habe es mit großen Binärdateien zu tun. Dafür war substr() nicht gedacht. – Tower

+0

Ich bin jetzt verwirrt. Sind die Binärdaten in einer Datei oder in einer PHP-Variable? Wenn eine Datei warum nicht fseek verwenden? – Craig

+0

Entschuldigung. Die Daten stammen aus einer Datei, die aus einer Übertragung stammt (kein Upload-Formular - ich könnte die temporäre Datei suchen, nicht das Dateisystem - ich kann fseek nicht verwenden oder macht keinen Sinn, Dateien dafür zu erstellen). – Tower

-1

Ich vermute, aber vielleicht was verlangt wird, ist eine Möglichkeit, Bytes für den Zugriff auf in einer Variablen durch Verwenden Sie einen Zeiger .. (Verwenden Sie es wie ein Array von Bytes, wie Sie in c tun könnten - ohne den Speicheraufwand, die Daten in PHP-Arrays zu setzen) und in der Lage, sie an Ort und Stelle ohne den Aufwand des Kopierens der Daten zu bearbeiten.

Nicht in der Lage, dies zu tun, ist ein großes Problem, aber wenn das Betriebssystem Datenträgerdaten gut mit fseek auf einer temporären Datei zwischenspeichert, könnte eine Umgehung sein.

+0

bereits gesagt, fseek ist nicht das, was Poster sucht. – franka