Socket Problem

DanielKobzan

Mitglied
Folgendes Problem:

Ich connecte mit

PHP:
$fp = fsockopen("udp://".$IP.", $Port, &$errno, &$errstr, 10);

zu einem Server, sende einen Befehl und bekomme eine Antwort. Nur in der Antwort sind mehrere "Ascii 0" enthalten und php gibt mir nur die Zeichen bis zu der ersten "0" aus. Wie schaff ich es nun, dass php alles ausgibt, damit ich die Antwort später genauer verarbeiten kann?
 
der hauptunterschied zwischen text- und binärdateien ist das vorkommen sogenannter "null-zeichen". ein normaler string wird für gewöhnlich mit einem null-zeichen abgeschlossen, was bei einer binärdatei nicht der fall ist.
kurz gesagt: das null-zeichen (ascii 0) stellt immer das ende eines strings dar. folglich kann man binäre daten nicht in einen string laden, um sie zu verarbeiten.

soviel zum hintergrund.
noch kürzer: alle daten, die ein null-zeichen enthalten, kannst du nicht als string verarbeiten, sondern nur als ein array mit zahlenwerten. wobei ein string aber letztlich auch nichts anderes ist.
 
ok, das hab ich kapiert, nur wie lad ich das in ein Array und wie kann ich das dann wieder auslesen. Ist es nicht möglich die "0" einfach durch was anderes zu ersetzen?
 
klar kannst du die 0 durch was anderes ersetzen, nur ist das ziemlich sinnlos, weil sich das dann nicht mehr eindeutig umkehren lässt. der ascii-zeichensatz besteht aus 256 verschiedenen zeichen (zwischen 0 und 255) und wenn du aus jeder 0 eine 1 machst, dann hast du das problem, dass beim umkehren jede 1 zu 0 wird - auch wenn es vorher schon eine 1 war.

in ein array einlesen kannst du das mit einer schleife:
Code:
$i = 0;
while ($c = fgetc($datei))
{
    $arr[$i] = $c;
    $i++;
}
 
ok, das funktioniert jetzt, aber nur so lange bis $c = "0" (nicht ASCII 0) ist, dann hört er auch auf. Wenn ich aber den Code so schreib:
PHP:
while ($i != 1275)
{
 	$c = fgetc($fp);
	$arr[$i] = $c;
	$i++;
}
dann wird alles ausgegeben. Nur ist die 1275 nicht sicher. Wenn die Antwort größer ist, bekomm ich nicht alles mit und wenn sie kleiner ist hängt er sich auf und gibt gar nichts aus. Wie schaff ich es nun, dass er die Antwort bis zu Ende liest?
 
eigentlich müsste das auch mit dem eof gehen:
Code:
while (! feof($fp))
{
    $arr[$i] = fgetc($fp);
    $i++;
}

oder du baust in den schleifenkopf die dateigrösse ein, das müsste auch gehen.
 
Zurück