Möglichkeit, DATA im Code zu schreiben ?

Anfängerfragen zum Programmieren mit PureBasic.
Axolotl
Beiträge: 55
Registriert: 31.12.2008 16:34

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

Beitrag von Axolotl »

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.

Ich würde sagen, dann müsste es ein (eindeutiges) Trennzeichen geben, anhand die Strings separiert werden können.
Dein selbstgewählter Schwierigkeitsgrad 'Verschlüsselte Daten' behindert dich natürlich auch hier.
Ohne Verwchlüsselung sind häufig #LF$, #CRLF$ oder auch |, Komma, Semikolon, Doppelpunkt, usw. im Einsatz. (Je nachdem was so im Text steht). Wie geschrieben, die Zeichen sollten eindeutig sein.
Dann geht die Separierung gut mit StringField().

Tipp: Zum Lernen einer Sprache sollte man nciht gleich alle Facetten der Sprache auf einmal versuchen. Schritt für Schritt kommt man hier a.m.S. am schnellsten zum Ziel.
Das würde hier konkret bedeuten: Statt die Daten im Code oder Data der Executable zu speichern, ist eine externe <beliebiger-name>.<beliebige-Ext> Datei vielleicht einfacher möglich. Aber Du wirst deine Gründe haben.
Mostly running PureBasic <latest stable version and current alpha/beta> (x64) on Windows 10 Home
Franky_FR
Beiträge: 45
Registriert: 08.05.2019 10:06

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

Beitrag von Franky_FR »

Axolotl hat geschrieben: 10.06.2021 11:15
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.

Ich würde sagen, dann müsste es ein (eindeutiges) Trennzeichen geben, anhand die Strings separiert werden können.
Dein selbstgewählter Schwierigkeitsgrad 'Verschlüsselte Daten' behindert dich natürlich auch hier.
Ohne Verwchlüsselung sind häufig #LF$, #CRLF$ oder auch |, Komma, Semikolon, Doppelpunkt, usw. im Einsatz. (Je nachdem was so im Text steht). Wie geschrieben, die Zeichen sollten eindeutig sein.
Dann geht die Separierung gut mit StringField().

Tipp: Zum Lernen einer Sprache sollte man nciht gleich alle Facetten der Sprache auf einmal versuchen. Schritt für Schritt kommt man hier a.m.S. am schnellsten zum Ziel.
Das würde hier konkret bedeuten: Statt die Daten im Code oder Data der Executable zu speichern, ist eine externe <beliebiger-name>.<beliebige-Ext> Datei vielleicht einfacher möglich. Aber Du wirst deine Gründe haben.
Ja, das mit der Verschlüsselung ist für den Anfang etwas viel, ich werde mich erstmal am grundsätzlichen Aufbau versuchen.
Von Saki gibt es auch noch das Tool Obfuscator+AES, damit wird es wohl gehen.
Apropos "grundsätzlich":
eine meiner Hauptfragen ist irgenwie untergegangen: hat das Ablegen in der DataSection nun Geschwindigkeitsvorteile ? Oder lässt sich das nicht so einfach sagen ? Das wissen bestimmt die ASMProfis, wieso wird überhaupt in Data-und Codesection unterschieden ? Nur der Übersichtlichkeit geschuldet oder hat das Hardware-Gründe (Prozessor ? Datenbus zugriff :roll: ?) Das es einen Teil gibt, in dem die Daten abgelegt werden, Z.b Strings, ist klar, aber das könnte man ja trotzdem in einer Section machen.
Benutzeravatar
Mijikai
Beiträge: 705
Registriert: 25.09.2016 01:42

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

Beitrag von Mijikai »

Der einzige Unterschied besteht darin das die DataSection normalwerweise nur Lese- und Schreibrechte hat.
Dies ist aber nicht zwingend so und daher kann auch ohne Probleme Code in der Datasection stehen.
Hat Vorteile wenn es um kompliziertere Dinge geht wie Polymorphism, Patching, Virtualization usw.
Viren z.B. hängen sich standardmäßig via. DataSection an eine Executable.
Axolotl
Beiträge: 55
Registriert: 31.12.2008 16:34

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

Beitrag von Axolotl »

Laut Hilfe ist die DataSection viel schneller ("much faster") als der Code Bereich.
Doku: https://www.purebasic.com/documentation ... /data.html
Mostly running PureBasic <latest stable version and current alpha/beta> (x64) on Windows 10 Home
Benutzeravatar
Mijikai
Beiträge: 705
Registriert: 25.09.2016 01:42

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

Beitrag von Mijikai »

Axolotl hat geschrieben: 13.06.2021 00:05 Laut Hilfe ist die DataSection viel schneller ("much faster") als der Code Bereich.
Doku: https://www.purebasic.com/documentation ... /data.html
Nur wenn die Daten nicht in der CodeSection selbst liegen.
Hier geht es eher um den Stack und das normale Laden von Daten.
Benutzeravatar
mk-soft
Beiträge: 3307
Registriert: 24.11.2004 13:12
Wohnort: Germany

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

Beitrag von mk-soft »

Die DataSection ist dazu da um statischen Daten gleich im Programm zu integrieren und müssen nicht als extra Dateien mitgeliefert werden.
Dazu gehören auch Sprungtabellen oder Voreinstellungen für das Programm. String konstanten im Programm werden automatisch in der DatenSection hinterlegt.

Wenn ich Textdateien in der DataSection hinterlege, sind diese in Format UTF8 und lese diese mit PeekS(?LabelStart, ?LabelEnd - ?LabelStart, #PB-UTF8)

Wenn die Daten verschlüsselt sein sollen, schreibe oder suche dir ein Tool das diese vorher als Datei Verschlüsselt und füge diese in die DataSection mit IncludeFile ein. Entschlüsse diese wieder im Programm bei Verwendung.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul / OPC-Helper DLL
PB v3.30 / v5.7x - OS Mac Mini OSX 10.xx / Window 10 Pro. (X64) /Window 7 Pro. (X64) / Window XP Pro. (X86) / Ubuntu 14.04
Downloads auf My Webspace
Franky_FR
Beiträge: 45
Registriert: 08.05.2019 10:06

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

Beitrag von Franky_FR »

Axolotl hat geschrieben: 13.06.2021 00:05 Laut Hilfe ist die DataSection viel schneller ("much faster") als der Code Bereich.
Doku: https://www.purebasic.com/documentation ... /data.html
Witzigerweise löst das Beispiel mit den VTables auch gleich meine Probleme, ich hatte keine Idee, wie ich beliebig auf die String-Einträge in Data zugreifen soll. Innerhalb von Prozeduren geht das jetzt, und ich könnte da dann auch die Decodier-Routine reinpacken und eventuell eine Zuweiung zu einer Struktur siehe Code.
Was mir nicht klar ist: wieso werden die Prozeduren mit einem Parameter *Pointer deklariert, die Prozeduren werden doch ohne Parameter aufgerufen ?
(Weil in Data @Prozedur angesprochen wird ?)
Das Programm funktioniert aber auch, wenn man den *Pointer Parameter wegläßt, siehe Code, bei s2 weggelassen.
Da in der DataSection nur die Verweise auf die Prozeduren stehen, sind etwaige Geschwindigkeitsvorteile wohl dahin.

Code: Alles auswählen

Interface StringObject
    Beschreibung1()
    Beschreibung2()
    Beschreibung3()
    Beschreibung4()
    Beschreibung5()
    
    
  EndInterface

  Procedure s1(*Self)
    MessageRequester("Beschreibung1", "String1")
    ;Decode crypted String
    ;evnt. Zuweisung Struktur
  EndProcedure
  
   Procedure s4(*Self)
     MessageRequester("Beschreibung4", "String4")
     ;Decode crypted String
    ;evnt. Zuweisung Struktur
  EndProcedure
  
  Procedure s5(*Self)
    MessageRequester("Beschreibung5", "String5")
    ;Decode crypted String
    ;evnt. Zuweisung Struktur
  EndProcedure
  
  Procedure s2() ; Pointer weggelassen
    MessageRequester("Beschreibung2", "String2")
    ;Decode crypted String
    ;evnt. Zuweisung Struktur
  EndProcedure
  
  Procedure s3(*Self)
    MessageRequester("Beschreibung3", "String3")
    ;Decode crypted String
    ;evnt. Zuweisung Struktur
  EndProcedure

  Procedure s6(*Self)
    MessageRequester("Beschreibung6", "String6")
    ;Decode crypted String
    ;evnt. Zuweisung Struktur
  EndProcedure
  
  

  String.StringObject = ?VTable

  String\Beschreibung1()
  String\Beschreibung3() ; beliebiger Zugriff auf die DATA Einträge
  String\Beschreibung2()
  String\Beschreibung4()
  String\Beschreibung5()
  
  
  


  DataSection
    VTable:
      Data.i ?Procedures
    Procedures:
      Data.i @s1(), @s2(),@s3(),@s4(),@s5(),@s6()
    EndDataSection
    
    
Benutzeravatar
mk-soft
Beiträge: 3307
Registriert: 24.11.2004 13:12
Wohnort: Germany

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

Beitrag von mk-soft »

Ein Pointer ist genau so groß wie ein Integer Variable
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul / OPC-Helper DLL
PB v3.30 / v5.7x - OS Mac Mini OSX 10.xx / Window 10 Pro. (X64) /Window 7 Pro. (X64) / Window XP Pro. (X86) / Ubuntu 14.04
Downloads auf My Webspace
Antworten