Seite 1 von 2

PDF mit Base64Encoder versenden

Verfasst: 27.06.2019 15:38
von stevie1401
Ich möchte gerne eine PDF Datei mit Base64 encoden, via TCP an einen Client senden und dann mit Base64Decoder wieder entpacken und öffen.
Aber ich check das einfach nicht.
Kann mir jemand einen Tip geben, noch besser ein Beispiel, wie ich eine PDF encode?



So funktioniert es jedenfalls NICHT:

Code: Alles auswählen





file$ = OpenFileRequester("Datei auswählen...","*.*","*.*",0)
If file$
  If ReadFile(0, file$) 
    length = Lof(0)                            ; Länge der geöffneten Datei ermitteln
    *MemoryID = AllocateMemory(length)         ; Reservieren des benötigten Speichers
    If *MemoryID
      bytes = ReadData(0, *MemoryID, length)   ; Einlesen aller Daten in den Speicherblock
                                               ;Debug "Anzahl der gelesenen Bytes: " + Str(bytes)
      
      pdf$=PeekS(*MemoryID ,bytes)
      
    EndIf
    CloseFile(0)
  EndIf
EndIf


Encoded$ = Base64Encoder(*MemoryID, MemorySize(*MemoryID))
; Debug "Encoded: " + Encoded$

*DecodedBuffer = AllocateMemory(1024)
Base64Decoder(Encoded$, *DecodedBuffer, 1024)
;Debug "Decoded: " + PeekS(*DecodedBuffer, -1, #PB_UTF8)
pdf2$=PeekS(*DecodedBuffer, -1, #PB_UTF8)



OpenWindow(1,0,0,1400,800,"Test")
WebGadget(2,10,10,800,600,pdf2$)




Repeat
  
Until WaitWindowEvent()=#PB_Event_CloseWindow



Re: PDF mit Base64Encoder versenden

Verfasst: 27.06.2019 20:12
von mk-soft
Sorry,

ich sehe hier nur Müll.

- Binärdaten von Datei laden und mit Peeks dann versuchen als String zu übernehmen. Geht gar nicht.
- Was hat ein WebGadget mit Daten über Netzwerk zu Senden und empfangen zu tun. Überhaupt nichts.

Re: PDF mit Base64Encoder versenden

Verfasst: 27.06.2019 22:32
von TroaX
Und Warum unbedingt Base64? Du kannst doch die Datei direkt als Bytestream versenden. Mit Base64 kann das Datenvolumen bis zu 35 % größer sein als die Datei. Ich sehe kein Grund für Base64.

Re: PDF mit Base64Encoder versenden

Verfasst: 05.07.2019 16:29
von stevie1401
Herrlich!
Vielen Dank für euch überaus freundliche Hilfe!

Re: PDF mit Base64Encoder versenden

Verfasst: 05.07.2019 16:41
von NicTheQuick
Das mit dem Webgadget verstehe ich aber auch nicht.

@mk-soft: Wir sind hier im Anfängerforum. Da darf man ruhig etwas netter sein. :wink:

@stevie1401:
Wenn du Binärdaten in einen Speicherbereich lädst, kannst du genau diesen Speicherbereich zusammen mit Base64Encoder() nutzen, also nach dem ReadData() musst du dann nur noch *MemoryId und length in den Befehl werfen und er spuckt dir die Bas64-kodierten Daten aus. PeekS() hat da nichts verloren, weil es für Strings gedacht ist und nicht für Binärdaten. Und wenn Base64Decoder() fertig ist, solltest du wieder FreeMemory() nutzen.

Wohin sollen die Daten dann eigentlich gesendet werden?

Re: PDF mit Base64Encoder versenden

Verfasst: 05.07.2019 17:12
von Kiffi
stevie1401 hat geschrieben:Herrlich!
Vielen Dank für euch überaus freundliche Hilfe!
anstelle dieses Kommentares hättest Du die Gelegenheit nutzen können, ein wenig Licht ins Dunkle zu bringen, denn offensichtlich weiß hier niemand so genau, was Du überhaupt vorhast.

Re: PDF mit Base64Encoder versenden

Verfasst: 05.07.2019 17:35
von NicTheQuick
Du redest auch davon, dass du die Daten an einen Clienten senden möchtest. Damit jemand dein Client sein kann, musst du zunächst mal einen Server starten, das geht mit CreateNetworkServer(). Aber das wird dann alles schon wieder eine ganze Ecke komplexer. Ich warte erst mal auf deine genauere Beschreibung des Problems.

Re: PDF mit Base64Encoder versenden

Verfasst: 06.07.2019 11:56
von mk-soft
Sorry,

aber nach fünf Jahren mit PB sollten so Fehler wie Binärdaten mit PeekS lesen nicht mehr passieren...

Bitte nicht böse sein

Server und Client Lösungen:

Daten über Netzwerk zu übertragen ist mit PB kein Problem.

Aber man muss wissen wie dieses mit TCP funktioniert und welche Einschränkungen es gibt.
Das TCP Protokoll erledigt dir das überprüfte übertragen von Daten bis zu 64 kBytes.
Diese werden auf kleinere Pakete aufgeteilt und kommen bis 64 kByte auch in der richtigen Reihenfolge an.

Aber nicht in einem Stück zu Deinem Programm, sondern als mehrer Pakete.
Somit muss man selber programmieren das die Daten vollständig angekommen sind.
Es kann auch passieren das im Fehlerfall nicht alle Daten ankommen. Dieses muss Dein Programm auch selber auswerten.

Die Lösung ist auf TCP Protokoll (ISO-Model bis Schicht 4) ein eigenes Protokoll zu setzen (ISO-Model Schicht 5+)
Diese macht auch zum Beispiel Http, FTP, etc...

Somit lässt man sich also ein eigenes Protokoll was auf dem TCP-Protokoll aufsetzt einfallen.

Diese muss Du dir aber nicht mit sehr vielen Stunden Arbeit selber erarbeiten. Das haben andere hier im Forum für dich erledigt.
Du möchtest das nur die Daten übertragen und diese dann anzeigen oder weiterleiten.

Hier zum Module NetworkTCP um Daten auch über 64 kBytes zu übertragen.
Link: viewtopic.php?f=8&t=31321

Es gibt auch noch andere sehr gut implementierte Protokolle hier im Forum die dir die Arbeit erleichtert.

Alles Gute und viel erfolg.

Re: PDF mit Base64Encoder versenden

Verfasst: 07.07.2019 09:43
von stevie1401
Nun, falls die Aufgabenstellung nicht klar ist, dann hier gerne noch einmal:
Ich möchte gerne eine PDF Datei mit Base64 encoden, via TCP an einen Client senden und dann mit Base64Decoder wieder entpacken und öffen.
Dass ich Base64 benutzen möchte hat natürlich seinen Grund. Ich habe nicht gesagt, dass ich die PDF Datei mit einem Purebasuc-Client empfangen möchte.
Ich möchte dies mit einem Spiderbasic-TCP-Socket-Client empfangen.
Insofern mag das für den geneigten Leser etwas verwirrend gewesen sein. Das war natürlich nicht meine Absicht.
Ich war mir nur nicht sicher, ob ich meine Frage nun ins Purebasic-Forum oder in die Abteilung Spiderbasic legen sollte.
Ich habe mich für die Anfängerabteilung von Purebasic entschieden, in der Hoffnung, hier leicht verständliche Antworten zu bekommen.

Also noch einmal genauer erklärt:
Ich habe einen Purebasic-Websocket-Server, der einem Spiderbasic-Websocket-Client eine PDF-Datei senden soll. Diese soll dann mit Spider mit Base64 empfangen und anschliessend geöffnet werden.

Ich habe mir übrigens auch das TCP-Beispiel angesehen und getestet.
Ich denke, es liegt am TCP selbst, dass es unfassbar lange dauert, bis man grössere Strings vom Server zum Client gesendet hat. Bei einem Teststring von ca 2,5 MB, braucht es weit über 1 Minute,bis alles angekommen ist. Selbst wenn Server und Client auf dem selben Rechner sind. Das entfällt also.

Re: PDF mit Base64Encoder versenden

Verfasst: 07.07.2019 11:44
von Bisonte
stevie1401 hat geschrieben:Ich denke, es liegt am TCP selbst, dass es unfassbar lange dauert, bis man grössere Strings vom Server zum Client gesendet hat. Bei einem Teststring von ca 2,5 MB, braucht es weit über 1 Minute,bis alles angekommen ist. Selbst wenn Server und Client auf dem selben Rechner sind. Das entfällt also.
Dies ist so nicht richtig.
Wenn es bei dir solange dauert, liegt es an der Internetgeschwindigkeit die gerade anliegt, oder an deiner Sende-, und Empfangstechnik.
Dem TCP-Protokoll ist es egal ob es sich um Strings handelt ;)

In den meisten Fällen ist es die Uploadgeschwindigkeit, oder aber das zu viele kleine Pakete verschickt werden.