PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr

PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr (https://www.php-resource.de/forum/)
-   PHP Developer Forum (https://www.php-resource.de/forum/php-developer-forum/)
-   -   String binär lesen, array (https://www.php-resource.de/forum/php-developer-forum/26277-string-binaer-lesen-array.html)

GriZZ 20-09-2003 04:53

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

TobiaZ 20-09-2003 12:32

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.

wahsaga 20-09-2003 16:12

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]; 


GriZZ 20-09-2003 20:21

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)/$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 ?

TobiaZ 21-09-2003 21:41

kannst du die zeichen denn anzeigen, wenn du mirt readfile() die datei ausgibst?

GriZZ 22-09-2003 02:26

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

TobiaZ 22-09-2003 15:48

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

GriZZ 22-09-2003 18:57

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

GriZZ 24-09-2003 15:06

<schieb>

na keiner mehr eine Idee ?

DSB 24-09-2003 22:33

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?

GriZZ 25-09-2003 15:16

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($buffer1);
        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


Alle Zeitangaben in WEZ +2. Es ist jetzt 17:32 Uhr.

Powered by vBulletin® Version 3.8.2 (Deutsch)
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.3.0
[c] ebiz-consult GmbH & Co. KG