Möglichkeit, DATA im Code zu schreiben ?

Anfängerfragen zum Programmieren mit PureBasic.
Franky_FR
Beiträge: 53
Registriert: 08.05.2019 10:06

Möglichkeit, DATA im Code zu schreiben ?

Beitrag von Franky_FR »

Hallo,

ich habe folgendes Problem: ich würde gerne Strings, die ich in DATA ablegen will, verschlüsseln.
Gibt es eine Möglichkeit, nachdem ich einen String mit einer Prozedur verschlüsselt habe, daraus ein DATA zur erzeugen ?
Oder generell z.B. etwas einzulesen, z.B.aus einem File, und daraus DATA-Statements zu erzeugen ?
Und noch eine andere Frage: viele Dinge, die mit DATA gemacht werden, könnt ich auch mit Strukturen machen.
Hat die Nutzung von DATA Geschwindigkeitsvorteile ?
Vielen Dank vorab !
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: Möglichkeit, DATA im Code zu schreiben ?

Beitrag von NicTheQuick »

Die DataSection und Strukturen sind zwei grundlegend verschiedene Dinge. Wie meinst du das, dass du vieles auch mit Strukturen machen könntest?

Ansonsten gibt es Tools, die dir aus einer Datei oder sonstigen beliebigen Daten eine DataSection erstellen. Zum Beispiel das hier aus dem englischen Forum: Data_Tool_BF - Data Generator - 50% smaller output + AES - Modules
Bild
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: Möglichkeit, DATA im Code zu schreiben ?

Beitrag von Mijikai »

Mit Inline-ASM einfach.

Beispiel:

Code: Alles auswählen

EnableExplicit

Procedure.i Main()
  Debug PeekS(?blob)
  ProcedureReturn #Null
  blob:
  !du 'Hello World!',0
EndProcedure

Main()

End
Um auch Daten in die Code Sektion zur Laufzeit schreiben zu können
muss die Code Sektion den Write-Flag gesetzt haben!
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: Möglichkeit, DATA im Code zu schreiben ?

Beitrag von NicTheQuick »

@Mijikai: Wieso schlägst du im Anfänger-Forum etwas mit ASM vor, wo es locker vermieden werden kann? Und mit der Verschlüsselung hast du dann immer noch nicht geholfen.
Ohne ASM geht es auch so:

Code: Alles auswählen

EnableExplicit

Debug PeekS(?blob_unicode)

Debug PeekS(?blob_ascii, -1, #PB_Ascii)

DataSection
	blob_unicode:
		Data.s "Hello World!"
	blob_ascii:
		Data.a 'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd', '!', 0
EndDataSection
Da Purebasics Strings pro Zeichen aus zwei Bytes bestehen, muss man beim Verschlüsseln und Entschlüsseln aufpassen wie man das genau tut, denn die String-Länge ist dann nur halb so lang wie die Länge des Strings im Speicher als Bytes. Deswegen habe ich in meinem Beispiel noch eine Möglichkeit für ASCII-Strings eingebaut.

Trotzdem, für's Verschlüsseln hilft das jetzt noch nicht. Aber dafür habe ich dir oben ja schon etwas verlinkt.
Bild
Franky_FR
Beiträge: 53
Registriert: 08.05.2019 10:06

Re: Möglichkeit, DATA im Code zu schreiben ?

Beitrag von Franky_FR »

NicTheQuick hat geschrieben: 07.06.2021 13:52 Die DataSection und Strukturen sind zwei grundlegend verschiedene Dinge. Wie meinst du das, dass du vieles auch mit Strukturen machen könntest?

Hallo,
ich möchte verschiedene Locations anlegen, die ich mit einem String beschreiben will.
Dafür könnte ich eine Struktur Locations anlegen mit einem Feld z.b. locations/beschreibung
und da den String ablegen.
Würde mir eigentlich besser gefallen, da intuitiver. Die Frage ist nun, ob es irgendwelche Vorteile bringt, die Strings per Data-Section anzulegen
und einzulesen (Geschwindigkeit ?)
Franky_FR
Beiträge: 53
Registriert: 08.05.2019 10:06

Re: Möglichkeit, DATA im Code zu schreiben ?

Beitrag von Franky_FR »

@Nic & Mijikai
Vielen Dank erstmal für die schnelle Antwort, allerdings verstehe ich das mit den Codes nicht so recht !
Mit peekS und ?label ist interessant, so auf die Datasection zuzugreifen, aber mir geht es ja darum,
irgendwie aus (später verschlüsselten) Strings DATA-Statements zu erzeugen.Man hat irgendwie das Henne-Ei-Problem:
ich könnte die Strings unverschlüsselt in DATA ablegen, müsste sie nach der verschlüsselung aber wieder irgendwie in DATA zurückschreiben,denn sie sollen ja verschlüsselt in Data stehen.
Die Tools sehen interessant aus.
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: Möglichkeit, DATA im Code zu schreiben ?

Beitrag von NicTheQuick »

Was genau ist denn dein eigentlicher Plan? Warum muss es die Datasection sein? Zum Schreiben ist die eigentlich nicht gedacht. Vor allem bleibt das Geschriebene ja nicht da, wenn du das Programm erneut startest. Du kannst die Daten nur von Anfang an in das Kompilat mit einbringen.
Und wenn du Strukturen über Datasections legen willst, dann musst du wissen, dass Strings in der Struktur nur ein Pointer auf den eigentlichen String sind und der String somit nicht aus der Datasection ausgelesen werden würde. Deswegen haben wir PeekS benutzt.

Ich glaube es ist einfacher, wenn du uns erklärst, was du eigentlich vor hast. Denn auch die Sache mit dem Ver- und Entschlüsseln bringt ja zum Beispiel nichts, wenn der Schlüssel dazu selbst im Kompilat ist.
Bild
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: Möglichkeit, DATA im Code zu schreiben ?

Beitrag von Mijikai »

NicTheQuick hat geschrieben: 08.06.2021 13:50 @Mijikai: Wieso schlägst du im Anfänger-Forum etwas mit ASM vor, wo es locker vermieden werden kann?
Dachte es beantwortet die Frage (zudem ist es nicht komplizierter als die Data.s Definition) -> Möglichkeit, DATA im Code zu schreiben ?
(In die Data Sektion kann natürlich auch geschrieben werden Read/Write ist Standart.)
Franky_FR hat geschrieben: 08.06.2021 14:12 ...aber mir geht es ja darum,
irgendwie aus (später verschlüsselten) Strings DATA-Statements zu erzeugen.Man hat irgendwie das Henne-Ei-Problem:
ich könnte die Strings unverschlüsselt in DATA ablegen, müsste sie nach der verschlüsselung aber wieder irgendwie in DATA zurückschreiben,denn sie sollen ja verschlüsselt in Data stehen.
Die Tools sehen interessant aus.
Ok, das ist einfach.
Bei Strings enstehen oft Sonderzeichen und der verschlüsselte String ist kein String mehr.
Am besten das Ergebnis (die verschlüsselten Daten) mit mit ShowMemory() anzeigen lassen und dann als Roh Daten abspeichern.

(Bei Strings eventuell die Terminations Null nicht vergessen - wenn benötigt)

In PBs DataSection danach so einbinden:

Code: Alles auswählen

DataSection
  RohDaten:
  IncludeBinary "Rohdaten.bin"
  EndeDerRohDaten:
EndDataSection
Um die Daten wieder auszulesen die Labels benutzen.

Anfang der Rohdaten: ?RohDaten
Größe der Rohdaten: (?EndeDerRohDaten - ?RohDaten)
Franky_FR
Beiträge: 53
Registriert: 08.05.2019 10:06

Re: Möglichkeit, DATA im Code zu schreiben ?

Beitrag von Franky_FR »

NicTheQuick hat geschrieben: 08.06.2021 15:13 Was genau ist denn dein eigentlicher Plan? Warum muss es die Datasection sein? Zum Schreiben ist die eigentlich nicht gedacht. Vor allem bleibt das Geschriebene ja nicht da, wenn du das Programm erneut startest. Du kannst die Daten nur von Anfang an in das Kompilat mit einbringen.
Und wenn du Strukturen über Datasections legen willst, dann musst du wissen, dass Strings in der Struktur nur ein Pointer auf den eigentlichen String sind und der String somit nicht aus der Datasection ausgelesen werden würde. Deswegen haben wir PeekS benutzt.

Ich glaube es ist einfacher, wenn du uns erklärst, was du eigentlich vor hast. Denn auch die Sache mit dem Ver- und Entschlüsseln bringt ja zum Beispiel nichts, wenn der Schlüssel dazu selbst im Kompilat ist.
Ich wollte, um Purebasic zu lernen, mal versuchen ein Grundgerüst eines Spiels zu schreiben, z.b. eines klassischen Adventures.
Dazu wollte ich einfach 3-4 "Räume" anlegen, und die Beschreibung dieser erfolgt ja mit Strings, z.b "Du befindest dich auf einem Pfad".
Das könnte ich mit Strukturen machen: Struktur Raum, Raum/Beschreibung, Raum/Exits ect. Die Frage stellte sich mir nun, ob das Anlegen einer String-Datasection dem gegenüber einen Vorteil bringen würde, z.b. Geschwindigkeit.Es muss ja einen Grund geben für die Teilung Code-Section/Data-Section.
Die zweite Frage war halt das verschlüsseln der Strings, ich hoffte nach Verschlüsselung in Main mit einer Prozedur die DATAs erzeugen zu können.
Macht aber wohl wirklich nicht viel Sinn, da die unverschlüsselten Strings dann ja auch im Hauptprogramm stehen Würden, also geht es wohl nur über externe Tools. Wobei eine Prozedur zum erzeugen DATA schon interessant wäre, die Tools müssen das ja auch irgendwie machen.
Franky_FR
Beiträge: 53
Registriert: 08.05.2019 10:06

Re: Möglichkeit, DATA im Code zu schreiben ?

Beitrag von Franky_FR »

Ok, das ist einfach.
Bei Strings enstehen oft Sonderzeichen und der verschlüsselte String ist kein String mehr.
Am besten das Ergebnis (die verschlüsselten Daten) mit mit ShowMemory() anzeigen lassen und dann als Roh Daten abspeichern.

(Bei Strings eventuell die Terminations Null nicht vergessen - wenn benötigt)

In PBs DataSection danach so einbinden:

Code: Alles auswählen

DataSection
  RohDaten:
  IncludeBinary "Rohdaten.bin"
  EndeDerRohDaten:
EndDataSection
Um die Daten wieder auszulesen die Labels benutzen.

Anfang der Rohdaten: ?RohDaten
Größe der Rohdaten: (?EndeDerRohDaten - ?RohDaten)
[/quote]

ShowMemoryViewer ist natürlich eine interessanter Ansatz, danke für den Tip, PB bietet so viele Möglichkeiten und Befehle.
Wenn ich in der Rohdaten.bin mehrere Strings habe, wie kann ich eingentlich auf einen einzelnen String darin zugreifen ?
Ist mir im Moment nicht klar. Ansonsten müsste ich für jede Beschreibung eine eigene .bin erstellen. Als Anfänger wirklich alles sehr schwierig. <)
Antworten