Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [erledigt] [PHP] Binärdaten aus XML (https://www.delphipraxis.net/123629-%5Berledigt%5D-%5Bphp%5D-binaerdaten-aus-xml.html)

littleDave 5. Nov 2008 18:40


[erledigt] [PHP] Binärdaten aus XML
 
Hallo,

ich hab da mal nen Problem: (bevor ich es vergessen: ich benutze PHP5)

Ich lade eine XML-Datei auf meinen Server hoch und ein PHP-Script soll das XML-File verarbeiten. In der XML-Datei sind auch binäre Daten drinnen, die folgendermaßen kodiert sind:

- Originaldaten (im Hexeditor): $0A$02$AF ...
- Daten in der XML-Datei: 0A02AF ... (als string)

Nun will ich diese Datei, die sich dahinter befindet, in eine seperate Datei schreiben. Dabei hab ich folgende Funktion geschrieben (es ist im Moment erstmal egal, dass die Datei 1 Byte länger werden kann)
Code:
function XMLBinaryToFile($xmlData, $TargetFile)
{
    $aFile = fopen($TargetFile, 'wb');
    for ($i = 0; ($i < strlen($xmlData)); $i += 4) {   
       
       $Value = hexdec('0x'.substr($xmlData, $i, 4));
       $arr  = pack('n', $Value);
       fwrite($aFile, $arr) ;
    }
    fclose($aFile);
}
Mein Problem ist jetzt, dass diese Funktion extrem langsam ist und die Daten in der XML-Datei mehrere 100 KB bis MB haben können. Das ist so viel, dass die Ausführungsdauer der php-Datei überschritten wird.

Jetzt ist meine Frage: gibt es dafür vielleicht eine viel schnellere Methode oder ist der Ansatz viel zu umständlich?

jfheins 5. Nov 2008 18:52

Re: [PHP] Binärdaten aus XML
 
Es könnte vll. was bringen, wenn du immer 4 Bytes liest statt 2 ... und evtl. statt substr direkt über die array-notation gehst.

Ansonsten bringts vll. was auf Base64 umzusteigen, das macht die Datei dann nicht doppelt so lang sondern nnur 4/3 ;)

Ansonsten: Könntest du diese Große Datei nicht einfach seperat übergeben?

So wie ein Upload-Feld in einem Formular als multipart request, sodass du im xml nur noch den dateinamen reinschriebst, und die eigentliche datei seperat übergibst?
Wäre imho die bessere Lösung ...

littleDave 5. Nov 2008 19:07

Re: [PHP] Binärdaten aus XML
 
Zitat:

Zitat von jfheins
Es könnte vll. was bringen, wenn du immer 4 Bytes liest statt 2 ... und evtl. statt substr direkt über die array-notation gehst.

Ok, ich probiers mal damit, vielleichts gehts dann ja etwas schneller

Zitat:

Zitat von jfheins
Ansonsten bringts vll. was auf Base64 umzusteigen, das macht die Datei dann nicht doppelt so lang sondern nnur 4/3 ;)

Ok, wenn ich die Binärdaten dann per Base64 im XML-Knoten gespeichert habe, wie bekomm ich die dann wieder in eine Binärdatei in php? Ich muss doch dann auch wieder "pack" benutzen. Oder gibts da vielleicht eine php-Funktion, die das bereits macht?

Zitat:

Zitat von jfheins
Ansonsten: Könntest du diese Große Datei nicht einfach seperat übergeben?

So wie ein Upload-Feld in einem Formular als multipart request, sodass du im xml nur noch den dateinamen reinschriebst, und die eigentliche datei seperat übergibst?
Wäre imho die bessere Lösung ...

Ich wollt ja gerade weg von mehreren Upload-Feldern. Bisher hab ich es ja auch so, doch ich wollt einfach eine kompakte Datei hochladen.

[EDIT]
Ich hab es nun mit Base64 gemacht, was jetzt extrem schnell funktioniert. Damit ist das Thema erledigt. Danke an jfheins für den Tip mit Base64 - hab daran garnicht gedacht :stupid:

Für alle, die wissen wollen, wie es geht:
Code:
function XMLBinaryToFile($xmlData, $TargetFile)
{
    // $xmlData   : Daten Base64 - kodiert
    // $TargetFile : Zieldatei
    // 'wb' : Schreiben + Binär
    $aFile = fopen($TargetFile, 'wb');
    fwrite($aFile, base64_decode( $xmlData )) ;
    fclose($aFile);
}

MSSSSM 5. Nov 2008 19:39

Re: [erledigt] [PHP] Binärdaten aus XML
 
und das ganze dann nochmal mit der zLib packen ;)
dann hast du noch weniger!

littleDave 5. Nov 2008 19:46

Re: [erledigt] [PHP] Binärdaten aus XML
 
Zitat:

Zitat von MSSSSM
und das ganze dann nochmal mit der zLib packen ;)
dann hast du noch weniger!

Der Upload an sich ist kein Problem - also von der Datenmenge her. Wenn ich die Daten zusätzlich noch mit zLib packe, entsteht aber zusätzlich noch CPU-Aufwand, da die Daten ja erst dekomprimiert werden müssen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:36 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz