Seite 2 von 2

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

Verfasst: 10.06.2021 11:15
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.

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

Verfasst: 12.06.2021 11:31
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.

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

Verfasst: 12.06.2021 13:00
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.

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

Verfasst: 13.06.2021 00:05
von Axolotl
Laut Hilfe ist die DataSection viel schneller ("much faster") als der Code Bereich.
Doku: https://www.purebasic.com/documentation ... /data.html

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

Verfasst: 13.06.2021 10:47
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.

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

Verfasst: 13.06.2021 11:32
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.

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

Verfasst: 13.06.2021 11:58
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
    
    

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

Verfasst: 13.06.2021 12:29
von mk-soft
Ein Pointer ist genau so groß wie ein Integer Variable