base64_decode spinnt
Norbert
- php
Hallo,
unter dieser Adresse findet man ein Script, welches die Unterschiede von zwei Ordnern mit Bildern darstellt, d.h. alle Uebereinstimmungen werden ausgeblendet. Clickt man auf ein rotes Feld (fehlendes oder aelteres Bild) wird ein Tranfer angestossen. Klappt er, verschwindet das Bild aus der Auflistung, geht was schief, bleibt es drin. Mit "reset" werden einige Bilder geloescht, dass man wieder etwas zum probieren hat.
Problem:
Einige Bilder werden nicht decodiert. Wie man im Protokoll-Array sehen kann, gibt "base64_decode" einen leeren String zurueck.
Ueber diesem Problem sitze ich schon etwas laenger, aber mir will einfach kein Grund fuer das Fehlverhalten von "base64_decode" einfallen.
Vielleicht hat ja hier jemand eine Erleuchtung ...
Gruss und Dank
Norbert
echo $begrüßung;
unter dieser Adresse findet man ein Script,
Nein, da findet man nur die Ausgabe eines Scripts.
Einige Bilder werden nicht decodiert. Wie man im Protokoll-Array sehen kann, gibt "base64_decode" einen leeren String zurueck.
Ohne das die Ausgabe erzeugende Script zu kennen lohnt sich nicht wirklich ein Blick dahin.
Vielleicht hat ja hier jemand eine Erleuchtung ...
Ich hab noch nicht mal eine einfache funktionierende Glaskugel und du verlangst nach einer beleuchteten ... :-)
Findet irgendeine Art der (HTTP-)Übertragung statt? Greift irgendein PHP-Mechanismus ein, Magic Quotes beispielsweise?
echo "$verabschiedung $name";
echo $begrüßung;
hmm,
was willst Du mir hier unterjubeln?
Bezeichner sind Schall und Rauch! Ist da wirklich was nettes drin oder eher etwas, womit ein Anwalt seinen Porsche finanzieren koennte?
Okay, aber nun zum Thema:
unter dieser Adresse findet man ein Script,
Nein, da findet man nur die Ausgabe eines Scripts.
richtig,
und das muss auch reichen!
Das letzte was ich gebrauchen kann, sind hinweise zu meinem Kot ... ;-)
Aber ich will ja nicht so sein tun:
<?php
$RP['received'] = array('time'=>$ZT,'file'=>$FN,'data'=>$BD,'size'=>strlen($BD).' byte');
$DD = base64_decode($BD);
$RP['decoded'] = array('size'=>strlen($DD).' byte');
?>
erzeugt den wesentlichen Teil der Anzeige.
Normalerweise hat $DD eine Laenge groesser 0, doch manchmal eben nicht !??
Wie man sieht, sieht man nix - zumindestens ich nicht.
Gruss von
Norbert dem Entnervten
Hallo Norbert,
unter dieser Adresse findet man ein Script,
Nein, da findet man nur die Ausgabe eines Scripts.
richtig,
und das muss auch reichen!
Du möchtest Dir also nicht helfen lassen? Warum postest Du dann überhaupt?
Das letzte was ich gebrauchen kann, sind hinweise zu meinem Kot ... ;-)
... aber Du möchtest, dass wir für Dich Deinen Fehler finden? Wie passt das zusammen?
Aber ich will ja nicht so sein tun:
<?php
$RP['received'] = array('time'=>$ZT,'file'=>$FN,'data'=>$BD,'size'=>strlen($BD).' byte');
$DD = base64_decode($BD);
$RP['decoded'] = array('size'=>strlen($DD).' byte');
?>
Allein für sich stehend, völlig irrelevanter Code. Du musst schon mehr bieten. Woher soll jemand, der Deinen Code nicht kennt, wissen, welchen Inhalt Deine Variablen haben können bzw. Deiner Ansicht nach haben sollten.
Wie sieht das Skript für den Transfer aus? Auf welche Art realisierst Du den Transfer. Das hatte dedlfix zwar bereits gefragt, Du bliebst allerdings die Antwort schuldig.
Es wäre eine gute Idee, die[Tipps für Fragende](http://forum.de.selfhtml.org/hilfe/charta.htm#tipps-fuer-fragende) zu lesen und danach zu handeln, wenn Du wirklich Hilfe haben möchtest.
Freundliche Grüße
Vinzenz
echo $begrüßung;
unter dieser Adresse findet man ein Script,
Nein, da findet man nur die Ausgabe eines Scripts.
richtig,
und das muss auch reichen!Du möchtest Dir also nicht helfen lassen? Warum postest Du dann überhaupt?
Das letzte was ich gebrauchen kann, sind hinweise zu meinem Kot ... ;-)
... aber Du möchtest, dass wir für Dich Deinen Fehler finden? Wie passt das zusammen?
Ach Vinzenz ... du hast ein paar seiner unsichtbaren Smileys überlesen. Er hat versucht witzig zu sein, was bei mir wie gewünscht ankam, bei dir anscheinend nicht. Schade. Humor kommt eben gelegentlich unterschiedlich an.
$DD = base64_decode($BD);
Meine gezielte Frage wäre: Wo kommt $BD her? (Oder alternativ: Was steht drin?)
Kontrollausgaben, am besten mit var_dump(), damit man auch den Typ des Variableninhalts angezeigt bekommt, sind zur Fehlersuche hilfreich.
echo "$verabschiedung $name";
Hai dedlfix,
$DD = base64_decode($BD);
Meine gezielte Frage wäre: Wo kommt $BD her? (Oder alternativ: Was steht drin?)
okay
im Ast ["received"]["data"] steht der Inhalt von $BD
im Ast ["received"]["size"] steht die Laenge von $BD
im Ast ["decoded"]["size"] die Laenge von $DD
Auf die Anzeige der Binaerdaten (im Erfolgsfall) habe ich verzichtet.
Kontrollausgaben, am besten mit var_dump(), damit man auch den Typ des Variableninhalts angezeigt bekommt, sind zur Fehlersuche hilfreich.
jain,
habe var_dump() statt dem print_r() eingebaut http://www.uris.de/ba.php
fand es vorher jedoch etwas uebersichtlicher ...
Gruss Norbert
echo $begrüßung;
Meine gezielte Frage wäre: Wo kommt $BD her? (Oder alternativ: Was steht drin?)
okay
im Ast ["received"]["data"] steht der Inhalt von $BD
Das ist leider nur die Antwort auf die Alternativ-Frage. Aber gut. Ich habe eine Vermutung. Ich vermute, dass dein String nicht nach Base64 sondern nach Radix-64 kodiert ist. Entferne ich die letzten 3 Zeichen vor den =-Zeichen am Ende lassen sich die Daten base64-decodieren, die vorher false geliefert haben.
Vielleicht ist es auch etwas ganz anders, denn die dekodierten Daten lassen in meinen Browsern kein Bild entstehen. Ich fragte ja nicht umsonst nach der Herkunft der Daten. Suche in dieser Richtung weiter nach der Ursache.
echo "$verabschiedung $name";
Hallo,
woher die Daten stammen steht doch auch da.
<?php
$bild = base64_encode(trim(implode(file('http://'.$source),'')));
?>
Der Inhalt von $source steht in ['source']['ort']
Der Inhalt von $bild steht in ['source']['val']
Danach wird der String via POST versendet und auch dies wird protokolliert:
Der zu sendende String in ["send"]['data'] und
der empfangene String $BD in ["received"]['data']
Die Strings sind immer gleich!
Nein,
die Strings sind nicht gleich, alle '+' werden in Leerzeichen umgewandelt.
Also werde ich sie mit str_replace wieder herstellen ...
PS:
Wuerde mich ja interessieren, wie viele Leute die Fehler in der Kontrollausgabe alle uebersehen haben?
Gruss und Dank
Norbert
echo $begrüßung;
woher die Daten stammen steht doch auch da.
Nein, diese Zeile stand in keinem deiner Postings und in deinen Quelltext gewährst du keinen Einblick.
$bild = base64_encode(trim(implode(file('http://'.$source),'')));
Und diese Zeile ist zumindest bei der Parameterreihenfolge von implode() fehlerhaft.
Desweiteren ist file() ungeeignet, wenn es darum geht, Binärdateien zu lesen. Das Zeilenumbruch-Rumgewurschtel das du hier betreibst, dürfte nicht gerade sehr förderlich für die Integrität deiner Bilddaten sein. Um Dateien komplett einzulesen, kann man file_get_contents() nehmen.
echo "$verabschiedung $name";
Hallo,
nun ist es am Ende doch so gekommen, wie ich es urspruenglich vermeiden wollte.
Es werden sinnfreie Behauptungen ueber funktionierenden Code ausgestossen.
Neuere Funktionen muessen nicht gleich besser sein.
Die "neuen" Kids sind ja auch "amtlich" duemmer (s.Pisa) ... ;-)
Viele "Verbesserungen" von PHP haette man IMHO einfach nur weglassen sollen.
Eventuell haette man dann urspruengliche Ziele erreichen koennen,
die jetzt nie mehr zu fassen sind.
Zu file_get_contents(): <zitat>Diese Funktion ist mit file() identisch</zitat>.
Ausserdem gibt es sie erst ab PHP/4.3.0 was fuer universelle Anwendungen disqualifiziert.
Und auch implode(); funktioniert unter Windows noch nicht im neuen Style,
also _muss_ man die traditionelle Form verwenden!
Gruss und Dank
Norbert
Hallo Norbert.
Zu file_get_contents(): <zitat>Diese Funktion ist mit file() identisch</zitat>.
Und den wichtigsten Teil schneidest du natürlich ab:
Diese Funktion ist mit file() identisch, außer dass file_get_contents() die Datei in einem String zurückgibt.
Einen schönen Samstag noch.
Gruß, Ashura
Hallo Norbert,
veranstaltest Du hier eine Schnitzeljagd oder willst Du vielleicht doch Hilfe? Ich vermute ja, dass Ersteres zutrifft, nur ohne Angabe eines konkreten Ziels.
Und auch implode(); funktioniert unter Windows noch nicht im neuen Style,
also _muss_ man die traditionelle Form verwenden!
Das stimmt so nicht. implode mit der im Handbuch dokumentierten Syntax
string implode ( string glue, array pieces )
funktioniert unter Windows ganz ausgezeichnet. Würdest Du bitte die Rahmenbedinungen klären, unter denen Deine Anwendung laufen soll:
PHP x.y.z auf den Betriebsystemen A, B und C mit konkreten Angaben für meine Platzhalter. Steht in den Tipps für Fragende.
Verwunderte Grüße
Vinzenz
echo $begrüßung;
Es werden sinnfreie Behauptungen ueber funktionierenden Code ausgestossen.
Gut, du hast Recht, was das implode betrifft. Mir ist schon lange keine PHP-Version mehr über den Weg gelaufen, die derart veraltet ist, dass implode() die von dir verwendete Parameterreihenfolge benötigt ...
Und auch implode(); funktioniert unter Windows noch nicht im neuen Style,
also _muss_ man die traditionelle Form verwenden!
... und das weder unter Windows noch unter Linux.
Zu file_get_contents(): <zitat>Diese Funktion ist mit file() identisch</zitat>.
Über das Weglassen des wichtigsten Teils wurde bereits etwas gesagt. Eine ebenfalls von dir nicht beachtete Handbuchaussage ist:
Mit PHP 4.3.0 ist file() "Binary Safe".
Ausserdem gibt es sie erst ab PHP/4.3.0 was fuer universelle Anwendungen disqualifiziert.
Wenn du schon, wie es aussieht, PHP in einer Version kleiner als 4.3.0 verwendest, dann beachte doch bitte auch solche Information.
trim() schneidet ggf. auch noch weitere Bytes ab. Whitespace-Zeichen mögen am Ende einer Textdatei nicht großartig auffallen, aber in Binärdateien sind sie meist nicht überflüssig.
Wenn du weder file_get_contents() nutzen kannst, noch file() für deinen Fall geeignet ist, solltest du dir mal fread() ansehen.
echo "$verabschiedung $name";
exit();