php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 08.04.2011, 22:28  
Neuer Benutzer
 
Registriert seit: 07.04.2011
Beiträge: 2
PHP-Kenntnisse:
Fortgeschritten
GPS_Läufer befindet sich auf einem aufstrebenden Ast
Standard XML-Datei (base64 + gzip) aus Garmin-GPS-Uhr entpacken

Ich bin gerade dabei ein privates Lauf-Portal zu programmieren. Ziel ist es, mit einem Webinterface auf eine Garmin-GPS-Laufuhr zuzugreifen, die Daten auszulesen und in einer DB abzulegen. Ich nutze dazu das Garmin Communicator Plugin. Es überträgt per JS eine XML-Datei von der Uhr über einen USB-Treiber an den Browser.

Nun gibt es in diesem Plugin die Möglichkeit, die XML-Daten komprimiert zu übertragen. Laut Garmin sind sie base64-codiert und mit gzip gepackt.

Eine Datei sieht so aus (Auszug):
Code:
begin-base64 644 data.xml.gz
H4sIAAAAAAAAC+2d7a7cx5Hev/sqBH1KgKhZ71VNyFx47ezGwHpjrL2LIF8CWjqQmUikQlK2935y
J7mxdM9oJZ4ZOsmUCj2ngb93YZjnnCHn5Xeqq6qfeurzv/nLN19/8qeHt+9evXn980+xwaefPLz+
4s2Xr15/9fNP//n3f/dZfPrJu/cvX3/58us3rx9+/unrN59+8jcvfvb579++fPV6/NAvH16/f3j7

...

//Ef56/L6X+ev/7bEQT+8btv/jAeBWCf/QLQ4LNZbX3wjfNHevoIx8d5+vV79frV669+OQLDw9tf
vXz/8g/jFbz42f8BviYocgWyBAA=
====
Die Übertragung funktioniert problemlos, aber ich schaffe es nicht, die Daten zu entpacken.

Ich habe jetzt verschiedene Varianten mit base64_decode und gzinflate/gzuncompress ausprobiert, es treten aber immer Fehler auf. In verschiedenen Foren wurde diese Frage schon in ähnlicher Form aufgeworfen, bisher ist mir aber noch keine Lösung bekannt.

Kann mir jemand weiterhelfen?

Geändert von GPS_Läufer (08.04.2011 um 23:58 Uhr).
GPS_Läufer ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 08.04.2011, 23:04  
Moderator¹
 
Registriert seit: 28.03.2010
Beiträge: 7.470
PHP-Kenntnisse:
Fortgeschritten
ChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer Anblick
Standard

Zitat:
Zitat von GPS_Läufer Beitrag anzeigen
Eine Datei sieht so aus (Auszug):
Code:
begin-base64 644 data.xml.gz
H4sIAAAAAAAAC+2d7a7cx5Hev/sqBH1KgKhZ71VNyFx47ezGwHpjrL2LIF8CWjqQmUikQlK2935y
Die erste Zeile gehört nicht zu den Base64-kodierten Daten, die musst du rauswerfen, bevor du das dekodierst.

Zitat:
Ich habe jetzt verschiedene Varianten mit [...] gzinflate/gzuncompress ausprobiert, es treten aber immer Fehler auf.
Das sind beides nicht die richtigen Funktionen, weil sie Daten entpacken, die mit dem DEFLATE- bzw. ZLIB-Algorithmus gepackt wurden.

Was du brauchst, ist die Funktion gzdecode. Sollte die auf deinem System nicht vorhanden sein, dann kannst du den Workaround versuchen, den der erste Nutzerkommentar im Manual vorschlägt.
__________________
RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
ChrisB ist offline   Mit Zitat antworten
Alt 08.04.2011, 23:23  
Neuer Benutzer
 
Registriert seit: 07.04.2011
Beiträge: 2
PHP-Kenntnisse:
Fortgeschritten
GPS_Läufer befindet sich auf einem aufstrebenden Ast
Standard

Argh!
Ich such mir den Wolf und es ist tatsächlich so einfach!

Hier für alle, die das gleiche Problem haben, die Lösung:

PHP-Code:
# $gzstring enthält die Daten

$tmp=explode (".gz",$gzstring); #Schneidet die erste (uncodierte) Zeile ab
$xml=gzdecode(base64_decode(trim($tmp[1]))); 
Wie du richtig angemerkt hast, hilft die Funktion aus dem Userbeiträgen im Manual, falls gzdecode nicht verfügbar ist:
http://www.php.net/manual/de/functio...code.php#84174

Danke für die superschnelle Hilfe!
GPS_Läufer ist offline   Mit Zitat antworten
Alt 08.04.2011, 23:37  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Mal davon ab, dass explode jetzt nicht die Funktion ist, mit der man Sachen wegschneidet, solltest Du auf jeden Fall explode (,, 2) verwenden.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Alt 09.04.2011, 15:30  
Erfahrener Benutzer
 
Benutzerbild von tr0y
 
Registriert seit: 26.07.2010
Beiträge: 4.874
PHP-Kenntnisse:
Fortgeschritten
tr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblick
tr0y eine Nachricht über MSN schicken
Standard

Es macht den anschein das dein GZIPped Base64-String ab der zweiten Zeile beginnt, er also durch einen Line-Separator getrennt wird vom Heading-Descriptor ( Die Zeile die aussagt was es ist, wie der Zugriff darauf eingestellt ist und wie die datei heißt ), am günstigsten wäre es wenn du den Line-Separator als brechpunkt nutzt. Das geht recht simpel mit file() ( wenns eine datei ist auf die du zugreifst ) oder mit explode('\n', $what, $limit). Wobei die logik es vereinfacht wenn man in beiden fällen ( gelieferter String oder gelieferte Datei ) explode mit einem Limit nutzt.

Zur Erläuterung - das Warum:
file() erzeugt ohne weitere konfiguration aus einer Datei ein Array. Dieses Array beinhaltet pro erkannter Zeile in der einen Array-Eintrag. Du würdest also aus diesem Array die erste Zeile entfernen ( shift'n ). Das Array-Shifting erlaubt die weiterverwendung der ersten Zeile, damit du bspw. mit dieser Zeile die abgetrennten Daten weiterhin identifizieren kannst. Code-technisch sieht das so aus:
PHP-Code:
$filename 'encoded.and.compressed.source.file.xml.gz.base64';
$filearray file($filename);

$header array_shift($filearray); // header abtrennen, rest da lassen
$filecontent array_shift($filearray); // content abtrennen, rest da lassen

// array sollte hier aufgelöst sein
if ( count($filearray) == ) echo "content successful extracted.";
else echo 
"array covers more than [Head] and [Content] or 
     [Content] was separated with new-line control signs"

In diesem Fall geht man davon aus das der String nirgendwo gebrochen wurde, sollte dieser gebrochen worden sein muss das restarray nach dem ersten shift'ing gejoint werden um einen repräsentativen base64-String zu erzeugen ( den man dann auch decoden kann ).

explode() erzeugt mit einem Limit ein Array das eine Anzahl an einträge hat die $limit entspricht, wobei der letzte Arrayeintrag alle nachfolgebrechungen als ganz-string enthält. Wie nikosch schon sagte solltest du hier mit einem Limit von 2 arbeiten. der 1ste Eintrag wäre dann die Header-Zeile, der zweite Eintrag der gesamte Base64-String. In deinem speziellen Fall würde ich aus "Sicherheitsgründen" sogar hingehen und den Content-Eintrag des Arrays noch trimmen, da Base64-Strings keine Leerzeichen enthalten (dürfen), wenn sie decodiert werden sollen. Code technisch, sieht das ganze dann so aus:
PHP-Code:
$inputstring "<< THIS COMES FROM ANYWHERE >>";

$stringarray explode("\n"$inputstring2); // max. 2 Entries

$header array_shift($stringarray); // header abtrennen
$content trim(array_shift($stringarray)); // content abtrennen

/* ... */ 
Was - Wir - allerdings nicht wissen können ist ob der Stirng wirklich die erste Zeile nur mit einem \n trennt, oder nicht auch noch ein \r enhält oder sonstige Steuerzeichen. Explode teilt einen String in mehrere. Es modifiziert nicht den String bedenke das. $content und $filecontent in meinen Beispielen sind deine Base64-Strings.

Die von mir hier erläuterte Methode nennt man übrigens: Stack-Processing. Ich leih mir das Prinzip dieser Methode für dein Problem aus, weil dessen Logik genau das macht was du möchtest.
__________________
Lasse mir ohne Anwendung von Gewalt Dinge schenken, Amazon weiß darüber bald mehr.

Geändert von tr0y (09.04.2011 um 17:03 Uhr).
tr0y ist offline   Mit Zitat antworten
Alt 12.04.2011, 10:03  
hts
Erfahrener Benutzer
 
Registriert seit: 07.09.2010
Beiträge: 722
PHP-Kenntnisse:
Fortgeschritten
hts befindet sich auf einem aufstrebenden Ast
Standard

tr0y, dir ist es gelungen, einen einfachen Sachverhalt kompliziert darzustellen.
hts ist offline   Mit Zitat antworten
Alt 12.04.2011, 13:48  
Erfahrener Benutzer
 
Benutzerbild von tr0y
 
Registriert seit: 26.07.2010
Beiträge: 4.874
PHP-Kenntnisse:
Fortgeschritten
tr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblick
tr0y eine Nachricht über MSN schicken
Standard

Glaub mir, meine Erklärung ist weit weg von kompliziert.
__________________
Lasse mir ohne Anwendung von Gewalt Dinge schenken, Amazon weiß darüber bald mehr.
tr0y ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Erledigt] gzip &quot;problem&quot; Codercrush PHP-Fortgeschrittene 11 29.08.2010 13:00
Automatisches entpacken einer ZIP Datei auf dem Server ePole PHP Tipps 2010 5 17.08.2010 11:55
XML Datei entpacken, einlesen, in Datenbank speichern & GUI Suchfenster W1nFr1ed PHP Tipps 2010 2 13.08.2010 16:42
Datei manipulieren Hubsi PHP Tipps 2010 8 11.07.2010 21:20
In PHP an einer bestimmten Position einer Datei schreiben. el_vital PHP Tipps 2010 4 06.06.2010 15:32
Datei per iframe einbinden - aber mit Parametern! mooonikaaa PHP Tipps 2009 2 05.12.2009 13:50
[Erledigt] Hochgeladene Datei wird doppelt abgelegt thecracked PHP Tipps 2008 3 01.07.2008 16:31
ZIP Datei auf Server kopieren, entpacken und Inhalt in DB PHP-Fortgeschrittene 40 06.06.2005 23:33
zm9 (Zip Datei) Hochladen und mit PHP entpacken! PHP Tipps 2005 3 25.04.2005 00:31
aus php datei eine pdf datei erzeugen lassen raffnix PHP-Fortgeschrittene 5 04.02.2005 15:08
[Erledigt] mail versand mit anhang (-- fopen(), fread(), filesize() --) PHP Tipps 2005 5 29.01.2005 18:36
xfdf Datei mit PHP an eMail senden Problem: Leere Datei PHP Tipps 2004-2 1 07.12.2004 12:25
[Erledigt] entpacken einer datei PHP-Fortgeschrittene 11 25.11.2004 16:16
Datei mit php erzeugen Stümper PHP Tipps 2004 4 12.10.2004 12:51
php und ftp PHP Tipps 2004 4 07.10.2004 09:58

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
gps uhren auslesen, begin-base64, php gzip entpacken, gzip php entpacken, xml gzip, xml auf garmin übertragen, garmin datei dekomprimieren, laufuhr manipulation, php xml gzip, gzip xml, xml base64 html, gzip base64 content decoder, xml base64, gzip base64 mit php, php base64 gzip, garmin communicator successfully aber nicht auf gps, garmin communicator plugin javascript .net, php xml übertragen, xml datei base64, xml base64 file content

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




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum