PDF mit Base64Encoder versenden

Anfängerfragen zum Programmieren mit PureBasic.
stevie1401
Beiträge: 659
Registriert: 19.10.2014 15:51
Kontaktdaten:

PDF mit Base64Encoder versenden

Beitrag 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


Ich programmiere nur noch mit Linux.
Linux Mint 21.x
Benutzeravatar
mk-soft
Beiträge: 3700
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: PDF mit Base64Encoder versenden

Beitrag 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.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
TroaX
Beiträge: 661
Registriert: 08.03.2013 14:27
Computerausstattung: PC: Ryzen 9 3950X, 96 GB RAM, RX6800XT, 2.5 TB SSD, 21:9 Display, Pop_OS! | Lappi: Ryzen 7 5800H, 16 GB RAM, 1 TB SSD, Pop_OS!
Wohnort: NRW
Kontaktdaten:

Re: PDF mit Base64Encoder versenden

Beitrag 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.
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Pop_OS!
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Pop_OS!
NAS: Fritz.Box :lol:
Coding: Purebasic 6.04 | PHP | HTML | CSS | Javascript
stevie1401
Beiträge: 659
Registriert: 19.10.2014 15:51
Kontaktdaten:

Re: PDF mit Base64Encoder versenden

Beitrag von stevie1401 »

Herrlich!
Vielen Dank für euch überaus freundliche Hilfe!
Ich programmiere nur noch mit Linux.
Linux Mint 21.x
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8679
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: PDF mit Base64Encoder versenden

Beitrag 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?
Bild
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: PDF mit Base64Encoder versenden

Beitrag 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.
Hygge
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8679
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: PDF mit Base64Encoder versenden

Beitrag 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.
Bild
Benutzeravatar
mk-soft
Beiträge: 3700
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: PDF mit Base64Encoder versenden

Beitrag 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.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
stevie1401
Beiträge: 659
Registriert: 19.10.2014 15:51
Kontaktdaten:

Re: PDF mit Base64Encoder versenden

Beitrag 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.
Ich programmiere nur noch mit Linux.
Linux Mint 21.x
Benutzeravatar
Bisonte
Beiträge: 2430
Registriert: 01.04.2007 20:18

Re: PDF mit Base64Encoder versenden

Beitrag 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.
Zuletzt geändert von Bisonte am 07.07.2019 20:50, insgesamt 1-mal geändert.
PureBasic 6.10 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
Antworten