kostenloser Webspace werbefrei: lima-city


einzelnes Byte mit fread lesen

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    ttobsen

    Kostenloser Webspace von ttobsen

    ttobsen hat kostenlosen Webspace.

    Hi Leute

    Mein Script verbindet sich mittels FSockOpen an eine kleine Anwendung die ich geschrieben habe. Die Verbdingung schaut so aus:

    $fp = fsockopen("tcp://derServer", 3000, $errno, $errstr, 30);  //Verbindung zum Server öffnen
    $Zahl = fread($fp, 1);
    fsocketclose($fp);


    Der Server sendet mir nun einen Byte, welches ich gerne als zahl ausgegeben h?tte. Wenn ich allerdings das ganze so auslese wie hier beschrieben, gibt er mir ja das ASCII Zeichen zur?ck. Das w?re nicht ganz das was ich will.

    Wenn ich zum Beispiel die 82 Senden will, dann lie?t er mir ein "R" aus, also den ASCII Code f?r 82 (gesendet wird nat?rlich nicht die 82 als String, sondern als Integer Zahl).

    Gibts da irgend eine L?sung f?r das Problem?

    Gru? Tobi
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. $Zahl = ord($Zahl);

    edit: siehe php.net, ist f?r so sachen recht gut...

    Beitrag ge?ndert am 24.12.2005 17:20 von pervamon
  4. Autor dieses Themas

    ttobsen

    Kostenloser Webspace von ttobsen

    ttobsen hat kostenlosen Webspace.

    Hi

    Naja das ist nicht ganz das was ich suche.

    Ich sende ein Byte an mein PHP Script. Und von diesem Byte h?tte ich gerne den Zahlenwert. Ich sende KEIN ASCII Zeichen (also kein Byte in Form einer bestimmten Kodierung), sondern einfach nur ein Byte, das einen bestimmten bin?ren Wert hat und diesen Bin?rwert h?tte ich gerne als Dezimalwert.

    Aber trotzdem Danke schonmal :)

    Gru? Tobi
  5. Hi

    evntl. ist das die L?sung (?):

    $chr = "f";
    $binary = decbin(ord($chr));


    So wird hier als Beispiel der Buchstabe f in den binary-Wert umgewandelt ($binary enth?lt jetzt den Wert 1100110). Du hast zwar gesagt, das du den Dezimal-Wert ben?tigst, aber das w?re ja mit ord() gel?st. Ist es das, was Du brauchst?

    mfg,
    hr

    Beitrag ge?ndert am 24.12.2005 21:01 von heavyraptor
  6. Autor dieses Themas

    ttobsen

    Kostenloser Webspace von ttobsen

    ttobsen hat kostenlosen Webspace.

    Hi

    Nein leider auch nicht ;)

    Aber danke das du dich am sp?ten heiligen Abend noch an mein Problem ranwagst ;)

    Also es ist ganz simpel:

    Ich sende ein Byte und ich m?chte den Dezimalwert des Bytes in einer Variablen stehen haben. Mehr nicht :)

    Das ganze sollte wenn m?glich auch ein klein wenig erwieterbar sein, indem ich ein Integerwert von 2 Bytes sende und deren Dezimalwert ausgeben lassen kann.

    Gru? Tobi

    Beitrag ge?ndert am 24.12.2005 21:07 von ttobsen
  7. Hi,

    es tut mir leid, aber ich verstehe nicht recht, was du gebrauchst ;).
    F?r ein Byte gibt es doch nur den ASCII-Integerwert oder den Binary-Integerwert. Es gibt garkein anderen. Vielleicht meinst du den Oktalwert? Das w?re auch ein Integer. Den k?nntest du mit decoct() umwandeln.
    Sonst f?llt mir leider nichts anderes ein ...

    mfg,
    hr
  8. Autor dieses Themas

    ttobsen

    Kostenloser Webspace von ttobsen

    ttobsen hat kostenlosen Webspace.

    hmmm

    Alsoooo

    Ich sende ein Byte. Wenn ich dieses per Fread in die Variable $Ausgabe schreiben w?rde, w?rde darin der ASCII Code stehen.

    Ich k?nnte nun ja den Integerwert mit ord auslesen. Was mach ich aber wenn ich zum Beispiel eine Zahl von 2 Bytes L?nge haben will. Dann tuts das schlie?lich nichtmehr.

    Darin sieht man wieder was f?r ein M?ll PHP ist, ohne die M?glichkeit zu haben variablen zu deklarieren :wink:

    Hoffentlich ist es nun verst?ndlicher.

    Gru? Tobi
  9. OK.
    Ich versuche es mit einer neuen Idee :biggrin:

    Ich hoffe cih habs richtig verstanden:
    Du schreibst mit fread ein Zeichen in eine Variable. Du willst den Integerwert von 2 Byte (du liest jetzt 2 Byte, oder?).
    Dann kannst du doch f?r jedes Zeichen den Wert umrechnen:

    $str = "abc";
    $int_werte = array();
    for ($i = 0; $i < strlen($str); $i++) {
     $int_werte[] = ord($str[$i]);
    }


    Jetzt wird ja jedes Zeichen umgerechnet und jetzt hast du ein array der jeden Code enth?llt.
    Ist es das? Ich galbe nicht, ich bin mir fast sicher, das es das nicht ist...

    Vielleicht so?:
    Du willst von einem Zeichen einen 2 Byte langen Integerwert. Wenn du das willst, dann kannst du ja in den hexa-wert umrechnen (?).

    Ich hoffe es hilft dir weiter.

    mfg,
    hr

    Beitrag ge?ndert am 24.12.2005 22:21 von heavyraptor
  10. Autor dieses Themas

    ttobsen

    Kostenloser Webspace von ttobsen

    ttobsen hat kostenlosen Webspace.

    lol

    Obwohl du mein Problem immer noch nicht richtig erkannt hast (ich hab keine Ahnung wie ich es besser ausdr?cken soll :frown:), hast du mir trotzdem eine m?gliche L?sung geben. Ist zwar relativ unprofessionell, aber wenn es funktioniert dann ist es mir recht ;)

    Doch dazu mu? ich deine L?sung etwas modifizieren.
    //Ich m?chte den Wert 22100 haben, bin?r = 01010110 11000010, PHP w?rde als ASCII Zeichen mit fread "V?" einlesen
    $EinDoofesASCIIZeichen = "V?";
    
    $bin_wert = "";
    
    for ($i = 0; $i < strlen($$EinDoofesASCIIZeichen); $i++) {
    
     $bin_wert = $bin_wert.decbin(ord($$EinDoofesASCIIZeichen[$i]));
    
    }
    $DezimalWert = bindec($bin_wert);


    Das w?ren wiedermal Nachteile warum Programmieranf?nger nicht PHP lernen sollten, man lernt einfach nichts was intern passiert :wink:

    Ich hoffe mal so funzt es nun, falls es elegantere L?sungen gibt bitte posten, w?re super nett!

    Gru? Tobi

    Beitrag ge?ndert am 25.12.2005 13:01 von ttobsen
  11. Hi,

    hmm, vielleicht bin ich einfach zu dumm, um dein Problem zu verstehen, aber ich versteh nun so ungef?hr was du willst.

    Ich hab deinen Code gerade ausprobiert, und der funktioniert ja (der wert, der ausgespuckt wird, ist zwar 22210, aber ich gelube, du hast das falsh hingetippt (??)). Dann hast Du ja was Du willst oder?
    Auf diese Idee bin ich ?brigens auch gekommen, aber ich dachte nicht dass du das gebrauchst, lol.
    Bessere m?glichkeiten um den Wert zu berechnen fallen mir da nicht ein.

    mfg,
    hr

    Beitrag ge?ndert am 25.12.2005 13:12 von heavyraptor
  12. Autor dieses Themas

    ttobsen

    Kostenloser Webspace von ttobsen

    ttobsen hat kostenlosen Webspace.

    Naja ich glaube nicht das du dazu zu doof bist!

    Das Problem ist halt das Leute die nur PHP programmieren sich keinen Kopf machen m?ssen, wie im innern des Systems die ganze Sache abl?uft. Aber egal, nun funktioniert es.

    Kannste wenn de magst hier mal schauen:

    http://ttobsen.xardas.lima-city.de/readzahl.php

    Das ganze ist nun ausgelegt f?r eine 4 Byte gro?e Integerzahl, ohne Negative Werte. F?r mein Vorhaben ben?tige ich zwar keine negativen Werte, aber vielleicht find ich ne Universall?sung.

    Das Problem an der zuletzt geposteten Version ist das es nat?rlich die 0en auff?llen mu?, damit ich imemr auf 8 Bit komme, also so:

    <?php
    
    function BinEdit($Bin)
    {
    $Ausgabe = "";
    for ($i = 0; $i < (8-strlen($Bin)); $i++)
    {
    $Ausgabe = $Ausgabe."0";
    }
    return $Ausgabe.$Bin;
    }
    
    echo "Die vom Server gesendete Zufallszahl lautet:<br>";
    
    $fp = fsockopen("217.81.173.52", 333, $errno, $errstr, 5);  //Verbindung zum Server ?ffnen
    
    $Zahl = fread($fp, 4);
    
    $bin_wert = "";
    
    for ($i = 1; $i <= 4; $i++) {
    
     echo "Byte ".$i.": ".BinEdit(decbin(ord($Zahl[$i-1])))."<br>";
      
     $bin_wert = $bin_wert.BinEdit(decbin(ord($Zahl[$i-1])));
    
    }
    
    $DezimalWert = bindec($bin_wert);
    
    echo $DezimalWert."<br><br>";
    
    echo "das ASCII Zeichen w?re:<br>";
    echo $Zahl;
    ?>


    Gibt es f?r sowas wiedermal ne nette unkomplizierte PHP integrierte Funktion? :biggrin:

    W?re echt praktisch.

    Also vielen Dank, schonmal das du mcih auf den richtigen Pfad gebracht hast, sonst w?rd ich jetzt noch gr?beln und mich aufregen.

    Gru? Tobi
  13. Gut, freut mich, dass es funktioniert :).
    Jetzt ist mir auch klar, was Du wolltest. Ich weiss nicht, ob es eine Funktion daf?r gibt, aber bei php.net steht nichts, es ist warscheinlich auch seleten, dass man so eine Funktion ben?tigt.

    Edit:
    Ich ahb die Funktion BinEdit noch ein bischen ver?ndert, jetzt ist sie nur 3 Zeilen lang:

    function BinEdit($bin) {
      return substr("00000000",strlen($bin) - 8) . $bin;
    }

    Cool, nicht wahr?

    Edit2:
    So geht's noch einfacher um alles zu machen:
    function dezimalWert($str) {
      $bin = "";
      for ($i = 0; $i < strlen($str); $i++) {
       $bin .= substr("00000000",strlen(decbin(ord($str[$i]))) - 8) . decbin(ord($str[$i]));
      }
      return bindec($bin);
    }
    
    echo "Dezimal-Wert von bla: " . dezimalWert("bla");


    Da nimmts mich jedoch noch wunder, f?r was brauchst du dieses Script? Was ist der Zweck?

    mfg,
    hr

    Beitrag ge?ndert am 25.12.2005 18:24 von heavyraptor
  14. Autor dieses Themas

    ttobsen

    Kostenloser Webspace von ttobsen

    ttobsen hat kostenlosen Webspace.

    heavyraptor schrieb:
    Da nimmts mich jedoch noch wunder, f?r was brauchst du dieses Script? Was ist der Zweck?


    Der Zweck ist ganz einfach, schauste hier:

    http://www.elpra.de/index.php?art=4001

    Ich m?chte da nun mehrere Informationen ?bertragen, zum Beispiel Dateigr??e des Bildes oder die L?nge und Breite. Dazu ben?tige ich diese Funktion.

    Wenn du das ganze mal testen m?chtest kannst hier nenn Beitrags chreiben, brauchst dich nciht zu registrieren:

    http://www.elpra.de/forum/viewtopic.php?t=19

    Ist halt ne feine Sache f?r alle Leute die irgendwie mathematsiche Formeln dynamsich auf Webseiten darstellen wollen.



    heavyraptor schrieb:
    function BinEdit($bin) {
      return substr('00000000',strlen($bin) - 8) . $bin;
    }


    Aber das w?re doch was ganz anderes! Dann w?rde jedes vorkommen von "00000000" durch eine Zahl + $bin ersetzt werden. Das w?re nicht wirklich korrekt :wink:

    Meine Funktion BinEdit soll nur die Fehlenden 0er vor den Bin?rwert schreiben, damit ich immer ein Byte habe.

    Aber trotzdem nochmal danke :)

    Gru? Tobi
  15. Hi,

    achso, jetzt verstehe ich den Zweck ;).

    Zur Funktion: Die Funktion macht doch das genaugleiche, ich hab sie sogar ausprobiert. Es ist nur eine verk?rzte Art den richtigen Bin?rwert zu bekommen.
    Deswegen funktioniert auch diese Funktion, mit der du gleich alles berechnen kannst, ohne dass du irgendwelche Zwischenschritte ben?tigst:

    function dezimalWert($str) {
      $bin = "";
      for ($i = 0; $i < strlen($str); $i++) {
       $bin .= substr("00000000",strlen(decbin(ord($str[$i]))) - 8) . decbin(ord($str[$i]));
      }
      return bindec($bin);
    }


    Probiers mal aus.

    mfg,
    hr
  16. Autor dieses Themas

    ttobsen

    Kostenloser Webspace von ttobsen

    ttobsen hat kostenlosen Webspace.

    So hab deine Funktion nochmal getestet, da war ein klitze kleiner Fehler drin.

    Und zwar mu? es hei?en:

    $bin .= substr("00000000", 0, 8 - strlen(decbin(ord($str[$i])))) . decbin(ord($str[$i]));

    Nun Funktioniert auch wirklich alles wie ich es will, wenn ich nochmal ein ?hniches Problem hab melde ich mich ;)

    Gru? Tobi
  17. Hi,

    du hast recht, dass man es so machen kann, aber die andere Variante geht auch ;). Wenn du z.B. den Bin?rwert 10010 hast, dann ist strlen(decbin(ord($str[$i]))) - 8 = -3. Also wird vom String "00000000" von der -3 Stelle an hinzugef?gt (also "000"). Dann kommt das gleiche Resultat.
    Du musst eben strlen(decbin(ord($str[$i]))) - 8 schreiben, nicht 8 - strlen(decbin(ord($str[$i]))), sonst geht es ja nicht, weil der Wert positiv ist. Es ist jedoch egal, denn so, wie Du es gemacht hast (mit dem 0 davor als 2. Argumment) geht's ja auch :biggrin:.

    mfg,
    hr
  18. Autor dieses Themas

    ttobsen

    Kostenloser Webspace von ttobsen

    ttobsen hat kostenlosen Webspace.

    heavyraptor schrieb:

    du hast recht, dass man es so machen kann, aber die andere Variante geht auch ;)


    Die andere Variante hatt irgendwie nicht richtig funktioniert. War etwas komisch, manchmal ging sie, manchmal aber auch nicht.

    Naja seeeehr verd?chtig ;)

    Gru? Tobi
  19. Hi,

    ich hab es nochmals ausprobiert, und es funktioniert wirklich beides.
    Hier hab ich noch von php.net:

    echo substr('abcdef', 1);     // gibt "bcdef"
    echo substr('abcdef', 1, 3);  // gibt "bcd"
    echo substr('abcdef', 0, 4);  // gibt "abcd"
    
    // Hier mit den negativen Werten:
    echo substr("abcdef", -1);    // gibt "f"
    echo substr("abcdef", -2);    // gibt "ef"
    echo substr("abcdef", -3, 1); // gibt "d"


    Deswegen meine ich, dass beide funktionieren.
    Das problem war eben mit dem -8, wie ich schon sagte. Man muss es nach dem strlen(decbin(ord($str[$i]))) hinschreiben und nicht davor ;).

    Ok, ich denke, dass es eigentlich egal ist, wie man es macht. Die funktion dezimalWert funktioniert ja, und dabei ist das Problem gel?st :).

    EDIT!!!!!:
    Du hast recht, es gibt einen bug :biggrin::
    Wenn man es mit einem Bin?rwert der 8 Zeichen lang ist (z.B. "10101010") versucht, dann geht es nicht. Ich weiss auch schon warum: strlen(decbin(ord($str[$i]))) - 8 w?re dann 0, also wird von "00000000" alles zur?ckgegeben (es wird zu 0000000010101010).
    Deine Variante ist wohl besser :).

    mfg,
    hr

    Beitrag ge?ndert am 26.12.2005 18:04 von heavyraptor
  20. Autor dieses Themas

    ttobsen

    Kostenloser Webspace von ttobsen

    ttobsen hat kostenlosen Webspace.

    heavyraptor schrieb:
    EDIT!!!!!:
    Du hast recht, es gibt einen bug :biggrin::


    Dann bin ich aber beruhig ;)

    Ich CLOSE mal das Thema, weil ich denke jetzt wurde echt alles gesagt!

    Und schau dir deine Leistung an, nicht eine andere Person hat hier gepostet, sollten sich alle was sch?men! :wink:

    Gru? Tobi

    Edit:

    Wieder offen, es k?nnte sein das noch jemand was zu sagen hat :wink:

    Gru? Tobi

    Beitrag ge?ndert am 27.12.2005 01:36 von ttobsen
  21. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!