Andreas Korthaus: Frage zu base64

Hallo!

Ich bechäftige mich immer noch mit der Datenübertragung, genauer mit der Übertragung eines gzip-Strings über HTTP.
Es gab 2 Varianten, einmal als urlencoded als einfache POST-Variable, aber dadurch wurde der gzip-String 3 mal so lang(durch urlencode), das ist mir etwas zu viel des guten.
Da wurde mir aber auch in diesem Zusammenhang base64 angeraten, nur habe ich dazu eine Frage. Ich habe mal testweise einen Binärstring mit base64 codiert, sieht ganz gut aus, nur wenn ich diesen String jetzt als urlencoded übertrage, bekomme ich da auch kein Probleme? z.B. kommen in dem base64-String "=" vor, wenn jetzt noch ";" oder "&" vorkommen kann ich das ganze ja vergessen!
Die andere Variante ist ja über multipart/form-data, aber da muß ich serverseitig den Umweg über eine temporäre Datei gehen, aber dafür kann ich den "blanken" binären Daten übertragen!
Wobei mir die erste Variante doch etwas lieber wäre, gerade bei weniger Datenvolumen. Hat da jemand Erfahrung mit base64?

Viele Grüße
Andreas

  1. Halihallo Andreas

    Ich bechäftige mich immer noch mit der Datenübertragung, genauer mit der Übertragung eines gzip-Strings über HTTP.
    Es gab 2 Varianten, einmal als urlencoded als einfache POST-Variable, aber dadurch wurde der gzip-String 3 mal so lang(durch urlencode), das ist mir etwas zu viel des guten.
    Da wurde mir aber auch in diesem Zusammenhang base64 angeraten, nur habe ich dazu eine Frage. Ich habe mal testweise einen Binärstring mit base64 codiert, sieht ganz gut aus, nur wenn ich diesen String jetzt als urlencoded übertrage, bekomme ich da auch kein Probleme? z.B. kommen in dem base64-String "=" vor, wenn jetzt noch ";" oder "&" vorkommen kann ich das ganze ja vergessen!
    Die andere Variante ist ja über multipart/form-data, aber da muß ich serverseitig den Umweg über eine temporäre Datei gehen, aber dafür kann ich den "blanken" binären Daten übertragen!
    Wobei mir die erste Variante doch etwas lieber wäre, gerade bei weniger Datenvolumen. Hat da jemand Erfahrung mit base64?

    Nun, base64, wie der name schon sagt, bildet dir jeden String in einen zweiten ab, der ausschliesslich _nur_ folgende Zeichen enthält:

    ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/

    ist aber auch sehr ineffizient (ich meine, er verschwendet auch ungeheuerlich viel Platz). Das einzige, was also Probleme geben könnte, ist das '+', welches als Space (0x20) dekodiert wird und eventuell das Zeichen '/', welches du umbedingt kodieren musst, da es sonst als "Unterverzeichnis-Token" interpretiert wird...

    Viele Grüsse

    Philipp

    1. Halihallo Andreas

      [...]

      Nun, base64, wie der name schon sagt, bildet dir jeden String in einen zweiten ab, der ausschliesslich _nur_ folgende Zeichen enthält:

      ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/

      ist aber auch sehr ineffizient (ich meine, er verschwendet auch ungeheuerlich viel Platz). Das einzige, was also Probleme geben könnte, ist das '+', welches als Space (0x20) dekodiert wird und eventuell das Zeichen '/', welches du umbedingt kodieren musst, da es sonst als "Unterverzeichnis-Token" interpretiert wird...

      Noch zur Speicherineffizienz:
      base64 => 64 Zeichen => 2^6 Möglichkeiten => 6 bits
      "ASCII"=> 255   "    => 2^8        "      => 8 bits

      =>

      3 "ASCII" (255 Zeichen) können durch 4 base64-Zeichen ersetzt werden, da

      3 * 8 bit = 24bit und
      4 * 6 bit = 24bit.

      =>

      du bekommst durch die base64-Kodierung 25% hinzu.

      Viele Grüsse

      Philipp

      1. Hi!

        du bekommst durch die base64-Kodierung 25% hinzu.

        33% meines Wissens, kommt aber auf den Standpunkt an ;-)

        Danke Dir! Daran hatte ich nicht geacht, aber bei 2 von 64 Zeichen macht das nicht viel aus - im Gegensatz zum binrstring, da waren das 100% der Zeichen!

        Aber was würdet Ihr sagen ist schneller(PHP):

        $string = preg_replace("///","%2F",$string);
        $string = preg_replace("/+/","%2B",$string);

        oder

        $string = urlencode($string);

        ?

        Viele Grüße
        Andreas

        1. Halihallo Andreas

          Danke Dir! Daran hatte ich nicht geacht, aber bei 2 von 64 Zeichen macht das nicht viel aus - im Gegensatz zum binrstring, da waren das 100% der Zeichen!

          Ich weiss zwar nicht, wie du auf 100% kommst, aber mir ist klar, dass du mit base64 weniger Arbeit hast ;)

          Aber was würdet Ihr sagen ist schneller(PHP):

          $string = preg_replace("///","%2F",$string);
          $string = preg_replace("/+/","%2B",$string);

          $string = urlencode($string);

          Hm... Dem Gefühl nach letzteres, aber diese Angabe ist wie immer ohne Gewähr :-)
          Ne, wenn ich das Programmieren müsste, würde ich beim letzteren eine For-Schleife machen, wo ich einfach alle nicht url-konformen Zeichen durch den entsprechenden Eintrag aus der "Codierungs-Tabelle" ersetze und in den output-stream kopiere. Ersteres wird wohl die RegExp-Engine anwerfen und ich glaube nicht, dass diese so performant wäre, wie eine For-Schlaufe. Aber eben: Ich weiss a) nicht, wie urlencode intern programmiert ist und b) gleiches gilt für die regExp-Engine.
          Sicherheit kriegst du wohl erst über einen Benchmark.

          Viele Grüsse

          Philipp

          1. Hallo!

            Ich weiss zwar nicht, wie du auf 100% kommst, aber mir ist klar, dass du mit base64 weniger Arbeit hast ;)

            vielleicht nicht 100, aber mindestens 95% der Zeichen des Binärstrings müssen url-kodiert werden, bei base64 nur gut 3%!

            Aber was würdet Ihr sagen ist schneller(PHP):

            $string = preg_replace("///","%2F",$string);
            $string = preg_replace("/+/","%2B",$string);

            $string = urlencode($string);

            Hm... Dem Gefühl nach letzteres, aber diese Angabe ist wie immer ohne Gewähr :-)
            Ne, wenn ich das Programmieren müsste, würde ich beim letzteren eine For-Schleife machen, wo ich einfach alle nicht url-konformen Zeichen durch den entsprechenden Eintrag aus der "Codierungs-Tabelle" ersetze und in den output-stream kopiere. Ersteres wird wohl die RegExp-Engine anwerfen und ich glaube nicht, dass diese so performant wäre, wie eine For-Schlaufe. Aber eben: Ich weiss a) nicht, wie urlencode intern programmiert ist und b) gleiches gilt für die regExp-Engine.
            Sicherheit kriegst du wohl erst über einen Benchmark.

            Ja, werde das mal testen. Muß denn die RegExp-Engine für jede RegExp in einem Script extra gestartet werden, oder wird die nur einmal gestartet?

            Mein Gedanke war nur, das urlencode auf zig Zeichen aufpassen muß, und der eigene reguläre Ausdruck nur auf 2. Ich könnte mir auch abenteuerlieche Konstrukte ohen regulären Ausdruck vorstellen, nur meine ich immer, das die in PHP implementierten Funktionen vielleicht in C geschreiben sind und erheblich schneller arbeiten können?! Aber so wirklich weiß ich das alles auch nicht, daher ja auch die Frage, würde mich wirklich mal interessieren wie das im Allgemeinen aussieht, was man wann am besten verwendet!

            Viele Grüße
            Andreas

            1. Halihallo Andreas

              Ich weiss zwar nicht, wie du auf 100% kommst, aber mir ist klar, dass du mit base64 weniger Arbeit hast ;)

              vielleicht nicht 100, aber mindestens 95% der Zeichen des Binärstrings müssen url-kodiert werden, bei base64 nur gut 3%!

              Nein! - Bei Base64 sind es _immer_ 25% da kommt's gar nicht auf den Inhalt an...

              [...]

              Hm... Dem Gefühl nach letzteres, aber diese Angabe ist wie immer ohne Gewähr :-)
              Ne, wenn ich das Programmieren müsste, würde ich beim letzteren eine For-Schleife machen, wo ich einfach alle nicht url-konformen Zeichen durch den entsprechenden Eintrag aus der "Codierungs-Tabelle" ersetze und in den output-stream kopiere. Ersteres wird wohl die RegExp-Engine anwerfen und ich glaube nicht, dass diese so performant wäre, wie eine For-Schlaufe. Aber eben: Ich weiss a) nicht, wie urlencode intern programmiert ist und b) gleiches gilt für die regExp-Engine.
              Sicherheit kriegst du wohl erst über einen Benchmark.

              Ja, werde das mal testen. Muß denn die RegExp-Engine für jede RegExp in einem Script extra gestartet werden, oder wird die nur einmal gestartet?

              Nun, der Parser muss bei dynamisch generierten RegExp wohl immer wieder angeworfen werden, es gibt jedoch auch die "kompilierten" RegExp, die nur einmal geparsed werden.

              Mein Gedanke war nur, das urlencode auf zig Zeichen aufpassen muß, und der eigene reguläre Ausdruck nur auf 2. Ich könnte mir auch abenteuerlieche Konstrukte ohen regulären Ausdruck vorstellen, nur meine ich immer, das die in PHP implementierten Funktionen vielleicht in C geschreiben sind und erheblich schneller arbeiten können?! Aber so wirklich weiß ich das alles auch nicht, daher ja auch die Frage, würde mich wirklich mal interessieren wie das im Allgemeinen aussieht, was man wann am besten verwendet!

              Nun, ja, ich nehm stark an, dass urlencode in C geschrieben wurde und mit einer ganz einfachen for-Schlaufe realisiert ist. Da muss kein RegExp geparsed werden. Egal, aufwieviele Zeichen er achten muss, die Zeit, die beim Parsen eingespart wird, macht das wohl wieder wett. Aber eben: Sicher bin ich mir nicht und vielleicht ist es sogar so, dass beide einmal schneller sind (eg. könnte es auf die Stringlänge ankommen).

              Viele Grüsse

              Philipp

              1. Hallo!

                vielleicht nicht 100, aber mindestens 95% der Zeichen des Binärstrings müssen url-kodiert werden, bei base64 nur gut 3%!

                Nein! - Bei Base64 sind es _immer_ 25% da kommt's gar nicht auf den Inhalt an...

                Das habe ich falsch erklärt, der ursprüngliche String wird 33% länger - immer. Aber der Base64 String besteht nur zu ca. 3% aus Zeichn die ich noch mit urlencode bearbeiten muß, also wird er kaum noch länger, der binäre gz-String besteht fast nur aus sonderzeichen, da muß ich 95% aller Zeichen mit urlencode bearbeiten, so wird der Sting fast 3 mal so lang!

                Nun, ich habe dann mal ein paar Test mit einem eigenen Datenbank-Dump gemacht, hat knapp 60 KB, aber die Ergebnisse sind nicht soooooo hilfreich, da alle Methoden im Millisekundebereich liegen, aber es kristallisiert sich eine Tendenz heraus.

                Erstmal das Script für die Branchmarks:

                function getmicrotime(){
                    list($usec, $sec) = explode(" ",microtime());
                    return ((float)$usec + (float)$sec);
                    }

                $string = get_table_data($tabelle);
                $compressed = gzcompress($string);
                $data = base64_encode($compressed);

                echo str_pad ("data-string: ",25).strlen($string)." bytes\n";
                echo str_pad ("compressed string: ",25).strlen($compressed)." bytes\n";
                echo str_pad ("base64-string: ",25).strlen($data)." bytes\n";
                echo str_pad (""+" in base64-string: ",25).substr_count($data,"+")."\n";
                echo str_pad (""/" in base64-string: ",25).substr_count($data,"/")."\n\n";

                $time_start = getmicrotime();
                $urlencode = urlencode($data);
                $time_end = getmicrotime();
                $time = $time_end - $time_start;
                echo str_pad ("Urlencode: ",20)."$time seconds\n";

                $time_start = getmicrotime();
                $from = array("/+/","///");
                $to = array("%2B","%2F");
                $regExp_1 = preg_replace($from,$to,$data);
                $time_end = getmicrotime();
                $time = $time_end - $time_start;
                echo str_pad ("1 regExp(perl): ",20)."$time seconds\n";

                $time_start = getmicrotime();
                $regExp_2 = preg_replace("/+/","%2B",$data);
                $regExp_2 = preg_replace("///","%2F",$regExp_2);
                $time_end = getmicrotime();
                $time = $time_end - $time_start;
                echo str_pad ("2 regExp(perl): ",20)."$time seconds\n";

                $time_start = getmicrotime();
                $from = array("+","/");
                $to = array("%2B","%2F");
                $regExp_3 = ereg_replace($from,$to,$data);
                $time_end = getmicrotime();
                $time = $time_end - $time_start;
                echo str_pad ("1 regExp(posix): ",20)."$time seconds\n";

                $time_start = getmicrotime();
                $regExp_4 = ereg_replace("+","%2B",$data);
                $regExp_4 = ereg_replace("/","%2F",$regExp_4);
                $time_end = getmicrotime();
                $time = $time_end - $time_start;
                echo str_pad ("2 regExp(posix): ",20)."$time seconds\n";

                $time_start = getmicrotime();
                $implode = implode("%2B",explode("+",$data));
                $implode = implode("%2F",explode("/",$implode));
                $time_end = getmicrotime();
                $time = $time_end - $time_start;
                echo str_pad ("Explode-Implode: ",20)."$time seconds\n";

                Ein typischer Ergebnis:

                data-string:             57877 bytes
                compressed string:       7036 bytes
                base64-string:           9384 bytes
                "+" in base64-string:    142
                "/" in base64-string:    147

                Urlencode:          0.000187039375305 seconds
                1 regExp(perl):     0.000286936759949 seconds
                2 regExp(perl):     0.000213980674744 seconds
                1 regExp(posix):    0.000173926353455 seconds
                2 regExp(posix):    0.00799000263214 seconds
                Explode-Implode:    0.00036096572876 seconds

                So wie es aussieht ist urlencode schon das beste, was mich aber _sehr_ verwundert ist das Abschneiden der beiden POSIX Varianten, die ja angeblich deutlich langsamer sind als die PERL-Kompatiblen mit preg_

                Aber die erste Variante ist die insgesamt schnellste! und die 2. dauert 50 mal so lange?!?!?! Wie kann das bitte sein? Vor allem ist das bei der PERL-Kompatiblen Variante genau umgekehrt, wenn auch nicht so ausgeprägt, aber die Tendenz bleibt bei allen Wiederholungen in etwa gleich!

                Viele Grüße
                Andreas

                1. Halihallo Andreas

                  [...]

                  Ein typischer Ergebnis:

                  data-string:             57877 bytes
                  compressed string:       7036 bytes
                  base64-string:           9384 bytes
                  "+" in base64-string:    142
                  "/" in base64-string:    147

                  Urlencode:          0.000187039375305 seconds
                  1 regExp(perl):     0.000286936759949 seconds
                  2 regExp(perl):     0.000213980674744 seconds
                  1 regExp(posix):    0.000173926353455 seconds
                  2 regExp(posix):    0.00799000263214 seconds
                  Explode-Implode:    0.00036096572876 seconds

                  So wie es aussieht ist urlencode schon das beste, was mich aber _sehr_ verwundert ist das Abschneiden der beiden POSIX Varianten, die ja angeblich deutlich langsamer sind als die PERL-Kompatiblen mit preg_

                  Aber die erste Variante ist die insgesamt schnellste! und die 2. dauert 50 mal so lange?!?!?! Wie kann das bitte sein? Vor allem ist das bei der PERL-Kompatiblen Variante genau umgekehrt, wenn auch nicht so ausgeprägt, aber die Tendenz bleibt bei allen Wiederholungen in etwa gleich!

                  Was passiert, wenn du das ganze Zeug in eine for-Schlaufe packst und etwa 1'000'000 mal iterieren lässt? - So genau kann auch Microtime nicht sein, dass du die Ablaufgeschwindigkeit eines einzigen Befehls signifikant messen kannst.

                  Viele Grüsse

                  Philipp

                  1. Hi!

                    #1 str_replace 2 Version
                        $str_repl_2 = str_replace("+","%2B",$data);
                        $str_repl_2 = str_replace("/","%2F",$str_repl_2);

                    #2 urlencode Version
                        $urlencode = urlencode($data);

                    dicht gefolgt von

                    #3 POSIX 1 Version
                        $from = array("+","/");
                        $to = array("%2B","%2F");
                        $regExp_3 = ereg_replace($from,$to,$data);

                    #4 str_replace 1 Version
                        $from = array("+","/");
                        $to = array("%2B","%2F");
                        $str_repl_1 = str_replace($from,$to,$data);

                    Obwohl str_replace 2 meist knapp in Führung liegt, werde ich wohl urlencode verwenden, das ist irgendwie einfacher und so gut wie nicht langsamer.

                    Nochmal die aktuelle Ausgabe:

                    generate string:    0.0422719717026 seconds
                    compress string:    0.00347793102264 seconds
                    generate base64:    8.30888748169E-005 seconds

                    data-string:             57877 bytes
                    compressed string:       7036 bytes
                    base64-string:           9384 bytes
                    "+" in base64-string:    142
                    "/" in base64-string:    147

                    Urlencode:          0.000148057937622 seconds
                    1 regExp(perl):     0.000293016433716 seconds
                    2 regExp(perl):     0.000200986862183 seconds
                    1 regExp(posix):    0.0001540184021 seconds
                    2 regExp(posix):    0.0093799829483 seconds
                    1 str_Replace:      0.000180006027222 seconds
                    2 str_Replace:      0.000147938728333 seconds
                    Explode-Implode:    0.000357031822205 seconds
                    substr:             0.0550709962845 seconds

                    Was passiert, wenn du das ganze Zeug in eine for-Schlaufe packst und etwa 1'000'000 mal iterieren lässt? - So genau kann auch Microtime nicht sein, dass du die Ablaufgeschwindigkeit eines einzigen Befehls signifikant messen kannst.

                    Wieso? es kommen die Zeichen knapp 300 mal vor, und immer wenn ich es wiederhole erhalte ich fast dasselbe Ergebnis. microtime ist IMHO sehr wohl genau genug! Woher kommt sonst die gleichbleibende Tendenz? Nur wie man sieht sind ander teile des Scriptes erheblich langsamer, vor allem das Komrimieren zuvor, und noch viel schlimmer das generieren der Daten aus der Datenbank. Aber ich kann das ja mal mit der kompletten Datenbank probieren, dann sind das nochmal erheblich mehr Daten, wobei ich selten mehr als die gerade getesteten DAten verwenden werde. Also ist das ganze eigentluch total egal mich hier um ein paar millisekunden zu streiten, wenn alleien die Übertagung von 10KB 1-2 Sekunden dauert!

                    Hier nochmal alle meine Versuche, der eingerückte Code ist der entscheidene:

                    $time_start = getmicrotime();
                        $urlencode = urlencode($data);
                    $time_end = getmicrotime();
                    $time = $time_end - $time_start;
                    echo str_pad ("Urlencode: ",20)."$time seconds\n";

                    $time_start = getmicrotime();
                        $from = array("/+/","///");
                        $to = array("%2B","%2F");
                        $regExp_1 = preg_replace($from,$to,$data);
                    $time_end = getmicrotime();
                    $time = $time_end - $time_start;
                    echo str_pad ("1 regExp(perl): ",20)."$time seconds\n";

                    $time_start = getmicrotime();
                        $regExp_2 = preg_replace("/+/","%2B",$data);
                        $regExp_2 = preg_replace("///","%2F",$regExp_2);
                    $time_end = getmicrotime();
                    $time = $time_end - $time_start;
                    echo str_pad ("2 regExp(perl): ",20)."$time seconds\n";

                    $time_start = getmicrotime();
                        $from = array("+","/");
                        $to = array("%2B","%2F");
                        $regExp_3 = ereg_replace($from,$to,$data);
                    $time_end = getmicrotime();
                    $time = $time_end - $time_start;
                    echo str_pad ("1 regExp(posix): ",20)."$time seconds\n";

                    $time_start = getmicrotime();
                        $regExp_4 = ereg_replace("+","%2B",$data);
                        $regExp_4 = ereg_replace("/","%2F",$regExp_4);
                    $time_end = getmicrotime();
                    $time = $time_end - $time_start;
                    echo str_pad ("2 regExp(posix): ",20)."$time seconds\n";

                    $time_start = getmicrotime();
                        $from = array("+","/");
                        $to = array("%2B","%2F");
                        $str_repl_1 = str_replace($from,$to,$data);
                    $time_end = getmicrotime();
                    $time = $time_end - $time_start;
                    echo str_pad ("1 str_Replace: ",20)."$time seconds\n";

                    $time_start = getmicrotime();
                        $str_repl_2 = str_replace("+","%2B",$data);
                        $str_repl_2 = str_replace("/","%2F",$str_repl_2);
                    $time_end = getmicrotime();
                    $time = $time_end - $time_start;
                    echo str_pad ("2 str_Replace: ",20)."$time seconds\n";

                    $time_start = getmicrotime();
                        $implode = implode("%2B",explode("+",$data));
                        $implode = implode("%2F",explode("/",$implode));
                    $time_end = getmicrotime();
                    $time = $time_end - $time_start;
                    echo str_pad ("Explode-Implode: ",20)."$time seconds\n";

                    $time_start = getmicrotime();
                    for ($i = 0; $i < strlen($data); $i++) {
                        if(substr ($data, $i, 1) == "+") {
                         $data = substr_replace ( $data, "%2B", $i, 1);
                     }
                     else if (substr ($data, $i, 1) == "/") {
                         $data = substr_replace ( $data, "%2F", $i, 1);
                     }
                    }
                    $time_end = getmicrotime();
                    $time = $time_end - $time_start;
                    echo str_pad ("substr: ",20)."$time seconds\n";

                    Viele Grüße
                    Andreas

        2. Hallo,

          Aber was würdet Ihr sagen ist schneller(PHP):

          $string = preg_replace("///","%2F",$string);
          $string = preg_replace("/+/","%2B",$string);

          Die regulären Ausdrücke kannst Du noch zusammenfassen. So müssen MB an Daten nicht sooft kopiert werden:

          $from = array ("///", "/+/");
          $to = array ("%2F", "%2B");
          $string = preg_replace ($from, $to, $string);

          Das ist auf jeden Fall effizienter als das obige. Ob das effizienter als urlencode ist, weiß ich nicht.

          Grüße,

          Christian

          1. Hallo!

            $string = preg_replace("///","%2F",$string);
            $string = preg_replace("/+/","%2B",$string);

            Die regulären Ausdrücke kannst Du noch zusammenfassen. So müssen MB an Daten nicht sooft kopiert werden:

            $from = array ("///", "/+/");
            $to = array ("%2F", "%2B");
            $string = preg_replace ($from, $to, $string);

            Oh! Wußte ich gar nicht, das kann ich gut gebrauchen, Danke Dir!
            Kann man das evtl noch abändern, das man jeweils die "from" => "to" Paare miteinenader verknüpft, denn wenn man längere Arrays hat könnte da aus Versehen ganz schön was durcheinander geraten ;-)

            Das ist auf jeden Fall effizienter als das obige. Ob das effizienter als urlencode ist, weiß ich nicht.

            Ich auch nicht, aber ich werde es gleich mal testen!

            Grüße
            Andreas

            1. Hallo Andreas,

              Oh! Wußte ich gar nicht, das kann ich gut gebrauchen, Danke Dir!
              Kann man das evtl noch abändern, das man jeweils die "from" => "to" Paare miteinenader verknüpft, denn wenn man längere Arrays hat könnte da aus Versehen ganz schön was durcheinander geraten ;-)

              Nicht direkt. Du kannst es aber ganz einfach selbst aufteilen:

              $pairs = array ("///" => "%2F",
                              "/+/" => "%2B");
              $from = array_keys ($pairs);
              $to = array_values ($pairs);

              Grüße,

              Christian

    2. Hi,

      Nun, base64, wie der name schon sagt, bildet dir jeden String in einen zweiten ab, der ausschliesslich _nur_ folgende Zeichen enthält:

      ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/

      ist aber auch sehr ineffizient (ich meine, er verschwendet auch ungeheuerlich viel Platz). Das einzige, was also Probleme geben könnte, ist das '+', welches als Space (0x20) dekodiert wird und eventuell das Zeichen '/', welches du umbedingt kodieren musst, da es sonst als "Unterverzeichnis-Token" interpretiert wird...

      hm, das "=" kann schon vorkommen - nämlich im padding, also am Ende und
      wenn dann nur am Endes des base64-Strings; entweder in 2 oder 3facher
      Ausführung, kommt auf die jeweilige Anzahl der bytes im Original an.

      bye eddie

      1. Hallo!

        Nun, base64, wie der name schon sagt, bildet dir jeden String in einen zweiten ab, der ausschliesslich _nur_ folgende Zeichen enthält:

        ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/

        ist aber auch sehr ineffizient (ich meine, er verschwendet auch ungeheuerlich viel Platz). Das einzige, was also Probleme geben könnte, ist das '+', welches als Space (0x20) dekodiert wird und eventuell das Zeichen '/', welches du umbedingt kodieren musst, da es sonst als "Unterverzeichnis-Token" interpretiert wird...

        hm, das "=" kann schon vorkommen - nämlich im padding, also am Ende und
        wenn dann nur am Endes des base64-Strings; entweder in 2 oder 3facher
        Ausführung, kommt auf die jeweilige Anzahl der bytes im Original an.

        Schande über mein Haupt, http://www.google.de/search?hl=de&ie=UTF-8&oe=UTF-8&q=base64&btnG=Google-Suche&meta=lr%3Dlang_de

        ergab als 2.

        http://aktuell.de.selfhtml.org/artikel/javascript/utf8b64/base64.htm#a2

        Und schon wieder bin ich überrascht was der Selfraum so alles zu bieten hat!

        Grüße
        Andreas

        1. Hi,

          Schande über mein Haupt, http://www.google.de/search?hl=de&ie=UTF-8&oe=UTF-8&q=base64&btnG=Google-Suche&meta=lr%3Dlang_de

          ergab als 2.

          http://aktuell.de.selfhtml.org/artikel/javascript/utf8b64/base64.htm#a2

          Und schon wieder bin ich überrascht was der Selfraum so alles zu bieten hat!

          mich nicht ;-)
          ...und Schande über mein Haupt, dass ich da ding immer noch nicht über-
          arbeitet habe... aber ab mitte des monats habe ich hoffentlich wieder
          etwas freiraum

          bye eddie

  2. Hi,

    Die andere Variante ist ja über multipart/form-data, aber da muß ich serverseitig den Umweg über eine temporäre Datei gehen, aber dafür kann ich den "blanken" binären Daten übertragen!

    Also, diesen Satz lese ich jetzt bestimmt zum 5. oder 6. Mal. Bis heute
    hat sich mir nicht erschlossen, warum das mit der temporären Datei nö-
    tig wäre. Ist das zur Sicherheit, ein Problem mit timeout oder was? Ich
    meine man kann multipart/form-data einfach auseinandernehmen, und das File in eine eine Variable schreiben, mit der man dann ales was man
    machen will auch tun kann... oder etwa nicht?

    ??????????????????? (ich weiß, Taste klemmt ;-)

    bye eddie

    1. Hallo!

      Also, diesen Satz lese ich jetzt bestimmt zum 5. oder 6. Mal. Bis heute
      hat sich mir nicht erschlossen, warum das mit der temporären Datei nö-
      tig wäre. Ist das zur Sicherheit, ein Problem mit timeout oder was?

      Die Temporäre Datei wird bei dieser Übertragungs-Form automatisch erstellt, d.h. der Server(Apache) nimmt den geschickten Header auseinander, erkennt das es sich um eine binär_Datei handelt und schreibt diese Binärdaten in eine temporäre Datei, dessen Pfad und einige weitere Angaben man in PHP vom Apache bekommt, um diese temporäre Datei dann wieterzu verarbeiten, normalerweise um eine Datei nach einem Upload woanders zu speichern, also die temp. Datei zu kopieren.
      Da ich nur an den Binärstrimg möchte, lese ich diese temporäre Datei halt in PHP direkt ein. Aber das ist halt ein Umweg der mir nicht gefällt. Wenn ich den String jetzt urlencodet als POST-Parameter übertrage habe, dann steht der String direkt zur Verfügung, ohne zwischendurch in eine temporäre Datei umgewandelt worden zu sein. Nur wie gesagt kann ich da keine binäen Daten verwenden.

      Viele Grüße
      Andreas

      1. Hallo,

        Die Temporäre Datei wird bei dieser Übertragungs-Form automatisch erstellt, d.h. der Server(Apache) nimmt den geschickten Header auseinander, erkennt das es sich um eine binär_Datei handelt und schreibt diese Binärdaten in eine temporäre Datei, ....

        Der Apache mahct nichts von selber. Entweder ist da ein Modul, das diesen Verarbeitungsschritt erledigt, oder es muß das aufgerufene Scripts selbst erledigen. Der Server liefert dabei die POST-Daten per STDIN an das Programm/Script, welches damit machen kann, was es will.
        Webb es die Daten irgendwo hinschreiben will, dann ist das dem Indianer genaus so egal, wie wenn das Programm die Daten einfach gen /dev/null wandern lässt. Er hat sie abgegeben und basta.

        Wie das PHP als Modul wirklich macht, weiß ich nicht, als CGI wird es sich halt beim Start irgendetwas einfallen lassen müssen.

        Grüße
          Klaus

        1. Moin,

          Wie das PHP als Modul wirklich macht, weiß ich nicht, als CGI wird es sich halt beim Start irgendetwas einfallen lassen müssen.

          PHP macht das zumindest bei der Modul-Inkarnation selbst (und ich sehe keinen Grund warum es sich bei CGI anders verhalten sollte) und soweit ich weiss kannst du nichts dagegen tun. Wenn dein Skript nämlich geladen wird, ist alles schon zu spät und PHP hat bereits alle Daten der POST-Eingabe gefressen. (Das war jetzt die Zusammenfassung eines Experiments, siehe: http://forum.de.selfhtml.org/archiv/2002/1/3759/#m22055) Und ja, unter Umständen ist das eine ziemlich nervige Einschränkung von PHP, aber da kann man wohl prinzipbedingt nichts gegen tun (schon weil das Skript so spät erst zum Zuge kommt).

          --
          Henryk Plötz
          Grüße aus Berlin