Binäre Daten aus einem Callback in Datei speichern?

Hier könnt ihr alle Fragen zu SpiderBasic austauschen.
Benutzeravatar
dige
Beiträge: 1239
Registriert: 08.09.2004 08:53

Binäre Daten aus einem Callback in Datei speichern?

Beitrag von dige »

Ich poste Daten zu einem Webserver / CGI und erhalte ein PDF gesendet.

Damit lande ich im CGI_CreatePDFCallback(success, Result.s)

In Result.s sind dann das PDF als binäre Daten enthalten.

Frage: wie kann ich die Binärdaten in eine Datei speichern?

Wenn ich einfach WriteString() nehme, sind die Daten verändert und das PDF defekt.
Das gleiche Problem bei dem Umweg über PokeS() und WriteData():

Code: Alles auswählen

Procedure CGI_CreatePDFCallback(success, Result.s)
  Protected *mem

  ; Überprüfen, ob der Callback erfolgreich war
  If success
    ; Öffne die Datei zum Schreiben (binär)
    If CreateFile(0, "myDocument.pdf", #PB_Ascii )
      ; Schreibe die Daten aus Result in die Datei
      ; WriteString(0, Result)

      *mem = AllocateMemory(Len(Result))
      PokeS(*mem, 0, Result, Len(Result), #PB_String_NoZero | #PB_Ascii)
      
      WriteData(0, *mem, 0, Len(Result))

      ; Exportiere die Datei als PDF
      ExportFile(0, "application/pdf", #PB_LocalFile)
      
      ; Schließe die Datei
      CloseFile(0)
    Else
      Debug "Fehler: Datei konnte nicht erstellt werden."
    EndIf
  Else
    Debug "Fehler: Callback nicht erfolgreich."
  EndIf
EndProcedure
Mache ich irgendwas falsch? Bzw. ja, klar ... mache ich .. aber wie gehts richtig?
"Papa, ich laufe schneller - dann ist es nicht so weit."
Benutzeravatar
dige
Beiträge: 1239
Registriert: 08.09.2004 08:53

Re: Binäre Daten aus einem Callback in Datei speichern?

Beitrag von dige »

Habe mir das von ChatGPT als Javascript Funktion erstellen lassen - funktioniert auch nicht :-(

Code: Alles auswählen

Procedure CGI_CreatePDFCallback(success, Result.s)

    !       // Konvertiere den binären String in ein Uint8Array
    !       const byteCharacters = v_result;
    !       const byteNumbers = new Array(byteCharacters.length);
    !       for (let i = 0; i < byteCharacters.length; i++) {
    !           byteNumbers[i] = byteCharacters.charCodeAt(i) & 0xFF;
    !       }
    !       const byteArray = new Uint8Array(byteNumbers);
    !
    !       // Erstelle einen Blob aus den Binärdaten
    !       const blob = new Blob([byteArray], { type: 'application/pdf' });
    !
    !       // Erstelle einen Link, um die Datei herunterzuladen
    !       const link = document.createElement('a');
    !       link.href = URL.createObjectURL(blob);
    !       link.download = 'myDocument.pdf';
    !
    !       // Füge den Link zum DOM hinzu, klicke darauf und entferne ihn wieder
    !       document.body.appendChild(link);
    !       link.click();
    !       document.body.removeChild(link);
Endprocedure
"Papa, ich laufe schneller - dann ist es nicht so weit."
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Binäre Daten aus einem Callback in Datei speichern?

Beitrag von NicTheQuick »

Du kannst keine binäre Daten in Strings speichern. Sobald im PDF an der falschen Stelle ein Nullbyte ist, ist der String beendet.
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: Binäre Daten aus einem Callback in Datei speichern?

Beitrag von DarkDragon »

NicTheQuick hat geschrieben: 23.05.2024 09:51 Du kannst keine binäre Daten in Strings speichern. Sobald im PDF an der falschen Stelle ein Nullbyte ist, ist der String beendet.
Dachte ich zunächst auch, aber ist das in SpiderBasic auch so? Ich meine in JS ist das nicht der Fall und nutzt SpiderBasic eigene String Typen? Aber generell ist String da gefährlich, auch wegen de-/encoding.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Binäre Daten aus einem Callback in Datei speichern?

Beitrag von NicTheQuick »

Hoppla :oops:
Mir ist wieder mal nicht aufgefallen, dass wir hier im SpiderBasic-Forum sind.

Dann kann ich auch falsch liegen. Ich hab mit SpiderBasic keine Erfahrung.
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: Binäre Daten aus einem Callback in Datei speichern?

Beitrag von DarkDragon »

dige: hast du mal die Binärdaten verglichen von dem was es sein müsste und dem was es abspeichert? Zuerst die Länge, dann hex output?

Unter linux könntest du das so machen:

Code: Alles auswählen

xxd orig.pdf > orig.pdf.hex
xxd spriderbasic.pdf > spiderbasic.pdf.hex
diff orig.pdf.hex spiderbasic.pdf.hex
Um zu sehen was denn genau fehlt/welche Zeichen betroffen sind.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
dige
Beiträge: 1239
Registriert: 08.09.2004 08:53

Re: Binäre Daten aus einem Callback in Datei speichern?

Beitrag von dige »

Am liebsten wäre mir eine Lösung, bei der ich mit WriteData() die Binärdaten speichern könnte.

Da ich Zugriff aufs CGI habe, codiere ich jetzt die Datei mit Base64 vor dem senden und kann das Client seitig wieder entpacken und speichern.

Wüsste aber gern, wie man auch binäre Daten verarbeiten kann..
"Papa, ich laufe schneller - dann ist es nicht so weit."
Benutzeravatar
TroaX
Beiträge: 684
Registriert: 08.03.2013 14:27
Computerausstattung: PC: Ryzen 9 3950X, 96 GB RAM, RX6800XT, 2.5 TB SSD, 21:9 Display, Linux Mint | Lappi: Ryzen 7 5800H, 16 GB RAM, 1 TB SSD, Linux Mint
Wohnort: NRW
Kontaktdaten:

Re: Binäre Daten aus einem Callback in Datei speichern?

Beitrag von TroaX »

dige hat geschrieben: 23.05.2024 11:09Am liebsten wäre mir eine Lösung, bei der ich mit WriteData() die Binärdaten speichern könnte.
Ich habe eben mal in die Spiderbasic-Doku geschaut. Ich lache immernoch. Mein Tipp: Übergehe den integrierten HTTPRequest, mach ihn nativ über die Fetch-API und schreibe den Response-Body direkt mit WriteDate in eine Datei. Du bekommt in den Callback dank des Null-Byte-Problems wahrscheinlich eh kein vollständges Ergebnis hinein.
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Linux Mint
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Linux Mint
NAS: Fritz.Box 5690 Pro (Nur für Keepass-DB)
Coding: Purebasic, Spiderbasic, GDevelop, Javascript/Node
Antworten