PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks. |
 |

20-09-2003, 04:53
|
GriZZ
Junior Member
|
|
Registriert seit: Nov 2002
Ort: HH
Beiträge: 60
|
|
String binär lesen, array
Hallo PHPler,
anbei gleich 2 Fragen, konnte im Forum leider nichts finden.
Ich habe einen binären string aus einem socket gelesen. (nicht fsockopen!), leider kann ich den string nicht mit explode zerlegen und ein array daraus machen, allerdings weiss ich wie sich der string aufbaut. wie kann ich nun den binärstring umwandeln ? Ich würde ja gern den string mal posten, aber leider sind zuviele zeichen enthalten die man hier nicht lesen könnte. substr() kann da nicht die lösung sein das würde ewig dauern.
String: (byte)(byte)(int32)(word)(word)(int16)(byte)(char)
Dann hab ich noch einen string aus dem ich ein array machen will:
String: key1\value1\key2\value2\key3\value3\.....\keyn\valuen
Ich habe mit explode("\\") den string zerlegt, allerdings ist es jetzt ein ewiger code wo ich dann das array mit key1=>value1 ... aufbaue. geht das nicht auch noch einfacher? habs mit preg_match(_all) auch ausprobiert, aber da kam nicht das raus was ich wollte.
Array(
key1 => value1,
key2 => value 2,
keyn => valuen
)
Für ansätze sowie für lösungen wäre ich total dankbar.
gruss und guten morgen bzw. nacht
|

20-09-2003, 12:32
|
TobiaZ
 Moderator
|
|
Registriert seit: Jan 2001
Ort: MUC und MGL, Germany
Beiträge: 34.421
|
|
fürs erste könnte man evtl regex nehmen. aber da kann man so nicht viel zu sagen.
2. würde ich ein explode machen, und dann halt mit ner schleife. das sind maximal 4 zeilen.
|

20-09-2003, 16:12
|
wahsaga
 Moderator
|
|
Registriert seit: Sep 2001
Beiträge: 25.236
|
|
Re: String binär lesen, array
jepp, für's zweite würde ich auch so vorgehen, wie tobiaz es vorschlägt:
"key1\value1\key2\value2\key3\value3"
exploden am \, ergibt ein array (nennen wir es mal $altesarray) mit "key1", "value1", "key2", "value", etc.
zuerst ermittelst du die arraylänge, also anzahl der einträge - im obigen beispiel sind das 6 stück.
jetzt lässt du eine schleife mit zählvariable $i von 0 bis (arraylänge/2)-1 laufen (hier also von 0 bis 2), und weist innerhalb dieser dann dem array die werte zu:
PHP-Code:
$neuesarray[$altesarray[$i*2]) = $altesarray[$i*2+1];
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
|

20-09-2003, 20:21
|
GriZZ
Junior Member
|
|
Registriert seit: Nov 2002
Ort: HH
Beiträge: 60
|
|
Super, danke für den Ansatz, hat mir weiter geholfen.
ich hab es jetzt auf mein script angepasst un es läuft :
PHP-Code:
$array = explode("\\", $buffer);
$result = array();
for ( $i = 1; $i <= sizeof($array)/2 ; $i++ ) {
$result[$array[$i*2-1]] = $array[$i*2];
}
print_r($result);
Allerdings hänge ich jetzt wieder bei meinem ersten Problem. Ich hab meinen Log-relay jetzt so umgestezt, dass er zumindest nach jedem (byte) oder (string) mir ein \x00 mitsendet... chr(0)
Wenn ich den String nun mit $array = explode( "\x00", $buffer) zerlege, dann bekomm ich die stringwerte schoen in einem array angezeigt, allerdings hat er probleme mit einigen binärzeichen mit ord(), kann ich mir zwar einige sichtbar machen, aber irgendwie nicht alle. mit fsockopen() und read($fp,1) läuft es, aber mit dem socket_read() noch nicht so ganz. wenn ich miir mit print_r($buffer) den string anzeigen lasse, dann bekomm ich nur die hällfte ausgegeben und er zerstört mir sogar den plain/text header.
Irgendeine Idee dazu ?
|

21-09-2003, 21:41
|
TobiaZ
 Moderator
|
|
Registriert seit: Jan 2001
Ort: MUC und MGL, Germany
Beiträge: 34.421
|
|
kannst du die zeichen denn anzeigen, wenn du mirt readfile() die datei ausgibst?
|

22-09-2003, 02:26
|
GriZZ
Junior Member
|
|
Registriert seit: Nov 2002
Ort: HH
Beiträge: 60
|
|
Moin,
ich arbeite ja leider nicht mit nem file. sondern mit den socket funktionen. die daten bekomm ich über ein logrelais gesendet und empfange die an meinem socket. somit hab ich nur einen string den ich darstellen kann.
andere idee ?
hat jemand schonmal mit unpack gearbeitet ? hab versucht den string damit zu zerlegen, aber an einigen stellen hab ich noch probleme damit, anderes zeigt er wunderbar an.
gruss grizz
|

22-09-2003, 15:48
|
TobiaZ
 Moderator
|
|
Registriert seit: Jan 2001
Ort: MUC und MGL, Germany
Beiträge: 34.421
|
|
ahso. also, wenn das durch die funktion geht, kannst du den string nicht mehr lesen (oder zeichen davon). Geht das denn, wenn du den gesamten string ausgibst
|

22-09-2003, 18:57
|
GriZZ
Junior Member
|
|
Registriert seit: Nov 2002
Ort: HH
Beiträge: 60
|
|
Es ist so, das ich mit socket_read() und socket write() arbeite, ich empfange ein packet und schreibe es in $buffer. der buffer enthällt dann das ganze packet als string, wenn ich den string im plain/text ausgebe, dann sehe ich das was in textform (string) (char) angegeben ist und halt den binären steuercode dazu in form von punkten oder quadraten etc.
ich muss nun das was string und char ist auslesen. und dazwischen den binärcode mit (ord) sichtbar machen. ich habe die funktion vorher mit fsockopen() und fread() gemacht und dann byteweise den string ausgelsenen in ein unpack('typ', $var) gegeben, allerdinsg kann ich den socket_read() nicht byteweise auslesen. ausserdem wenn der string eine länge von 1500 bytes hat, dann ist es nicht sinvoll jedes einzelne byte durch eine function auszulesen.
vielleicht hilf das weiter.
gruss grizz
|

24-09-2003, 15:06
|
GriZZ
Junior Member
|
|
Registriert seit: Nov 2002
Ort: HH
Beiträge: 60
|
|
<schieb>
na keiner mehr eine Idee ?
|

24-09-2003, 22:33
|
DSB
Banned
|
|
Registriert seit: Dec 2002
Ort: Hamburg
Beiträge: 374
|
|
Hmm, man kann ja in str_replace auch Arrays als Argumente einsetzen und so auf einen Schlag recht performancetreu haufenweise Zeichen ersetzen.
Ich würde mir ne Funktion basteln, der ich den String übergebe und als Returnwert den "bereinigten" (anzuzeigenden) String zurückbekomme.
Man könnte also für jedes Sonderzeichen ein Quadrat anzeigen lassen und die "normalen" Zeichen unangetastet lassen.
Das liefe jetzt aber auf eine recht großes Such- und Ersetzungsarray hinaus.
Ich meine, dass es auch geht str_replace zusammen mit Reg-Exs zu benutzen, aber da weiss ich leider auch nicht, wie es genau geht.
Vielleicht bringt Dich das auf neue Lösungswege?
|

25-09-2003, 15:16
|
GriZZ
Junior Member
|
|
Registriert seit: Nov 2002
Ort: HH
Beiträge: 60
|
|
Ich hab es jetzt so gemacht und es funktioniert super, hab diese funktion für (char)(byte)(string)(int)(float) geschrieben:
das ganze funktioniert fast wie in Perl, nur mit leerzeichen kommt er nicht klar deswegen ersetz ich erst alle leerzeichen duch ESC, in der funktion selbst schreib ich dann das ESC zu SP zurück :-) um es für die anderen datentypen zu benutzen, einfach den unpack ändern und den substr am buffer anpassen :-)
PHP-Code:
$buffer = str_replace( "\x20", "\x1B", $buffer);
dann jage ich den $buffer durch die funktion. wichtig ist die referenz, denn sonst schneidet sich der buffer ja nicht ab :-)
PHP-Code:
function _unpack_string(&$buffer, $count = 1){
$string = array();
for($i = 1; $i <= $count; $i++){
do {
$a = unpack ('A1var', $buffer);
$byte = $a['var'];
$buffer = substr($buffer, 1);
if ($byte == "\x1B")
{$byte = " ";}
@$string[$i] .= $byte;
}while ( $byte != "\x00" );
}
if ($count == 1){
return $string[1];
}
return $string;
}
den count hab ich mit reingenommen um gleich mehrere strings nacheinander zu ziehen. unpack macht immer ein array.
vielleicht kann es ja noch jemand gebrauchen.
GruZZ und Danke GriZZ
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
Themen-Optionen |
|
Thema bewerten |
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
|
PHP News
|