Frage zu Schreibweise [ ] und { } bei Array in Strukturen

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Kurzer
Beiträge: 1621
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Frage zu Schreibweise [ ] und { } bei Array in Strukturen

Beitrag von Kurzer »

Hallo,

bei der Umsetzung eine Prozedur für "Search/Replace" für binäre Daten zu schreiben, stolpere ich in der Hilfe in der
Sektion "Structure" über die folgenden Schreibweisen für Arrays in Strukturen:

Structure Irgendwas
Text1.s[2]
Text2.s{2}
EndStructure

Frage: Worin besteht der Unterschied zwischen Verwendung der eckigen Klammern und den geschweiften Klammern?

Und btw. was wäre der schnellste Ansatz (bezogen auf die Ausführunggeschwindigkeit), um in einer binären Datei
eine beliebig lange Bytefolge zu finden?

Angenommen man sucht "Apollo Mission" in einer Binärdatei (ich habe hier aus Darstellungsgründen einen Stringgewählt.
Die Prozedur soll natürlich nach beliebeigen Werten [$00-$FF] suchen können).

Ich würde die gesamte Datei zuerst in einen Speicherblock laden und dort mittels Schleife nach dem ersten
Byte der gesuchetn Bytefolge suchen (Also nach einem "A" bzw dem Byte $41). Erst, wenn dieses Byte übereinstimmt,
würde ich an dieser Stelle einen vollen Vergleich auf die gesamte nachfolgende Bytefolge durchführen ("pollo Mission").

Wenn die gesuchte Bytefolge > 2 oder > 4 Bytes ist, kann man das ganze auch mit einer WORD oder LONG Suche
beginnen ("Ap" bzw. "Apol", um nicht zu viele Fehlfunde zu bekommen die dann zeitraubend auf die gesamte Bytefolge geprüft werden.

Bietet PB andere Möglichkeiten, um eine schnelle Suche in Speicherblöcken zu realisieren?

Gruß Kurzer
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.12 x64, OS: Win 11 24H2 x64, Desktopscaling: 150%, CPU: I7 12700 H, RAM: 32 GB, GPU: Intel(R) Iris(R) Xe Graphics | NVIDIA GeForce RTX 3070
Useralter in 2025: 57 Jahre.
Benutzeravatar
_JON_
Beiträge: 389
Registriert: 30.03.2010 15:24

Re: Frage zu Schreibweise [ ] und { } bei Array in Strukture

Beitrag von _JON_ »

Text1.s[2] ist ein Array also 2 Stringadressen.
Text2.s{2} ist ein String mit Länge 2, der direkt dort im Speicher ist.

Für die binären Suche, ist den eine Schleife mit CompareMemory so lahm?
PureBasic 5.46 LTS (Windows x86/x64) | windows 10 x64 Oktober failure
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7035
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Frage zu Schreibweise [ ] und { } bei Array in Strukture

Beitrag von STARGÅTE »

Ich schließe mich _JON_ an und würde noch ergänzen wollen:

Wenn du mit binären Daten arbeiten willst, solltest du auf Strings komplett verzichten.
Strings werden nun mal immer bei einem NUL-Byte abgeschnitten und können dann auch noch im ASCII, UTF8 oder Unicode vorliegen.

Im Prinzip möchtest du ja eine suche auf Byte-Ebene haben, somit musst du zwangsweise pro Byte suchen.
Hier könnte man zB ein unendliches Byte-Array nutzen:

Code: Alles auswählen

Structure ByteArray
	b.b[0]
EndStructure
Diese Struktur hat selbst keine größe, aber man kann durch sie schnell im Speicher per Index springen:

Code: Alles auswählen

Structure ByteArray
	b.b[0]
EndStructure

Define *Buffer.ByteArray = AllocateMemory(2000)
Define Length = MemorySize(*Buffer)

RandomData(*Buffer, Length)

Define Index.i = 0
While Index < Length
	If *Buffer\b[Index] = 65
		Debug "An Position "+Index+" wurde ein "+Chr(65)+" gefunden"
	EndIf
	Index + 1
Wend
Hast du dann das erste Byte gefunden, kannst du ein CompareMemory() nutzen, um den Rest des Such-Blocks zu vergleichen.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8820
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: Frage zu Schreibweise [ ] und { } bei Array in Strukture

Beitrag von NicTheQuick »

Zum Suchen würde ich den Knuth-Morris-Pratt-Algorithmus verwenden.
Benutzeravatar
Kurzer
Beiträge: 1621
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Re: Frage zu Schreibweise [ ] und { } bei Array in Strukture

Beitrag von Kurzer »

Besten Dank für eure Hinweise. :allright:

Nun sehe ich klarer - insbesondere mit der Text.s{2} Geschichte. Da hätte ich aufgrund der Beispiele im Bereich "Structure" in der Hilfe eigentlich selbst drauf kommen können. Aber explizit erklärt ist das nicht in der Hilfe, glaube ich.

Die Sache mit dem ByteArray ist sehr elegant, ich hätte vermutlich nur einen *BufferPointer mit +1 erhöht. Das ByteArray gefällt mir besser.

Und ja, ich hatte einen kurzen Augenblick überlegt, ob ich String-Suchfunktionen nutze, weil ich in den Binärdateien eigentlich nur Strings ändern möchte. Aber das ist Unsinn (wie STARGÅTE schon treffend feststellte). Zum Ändern und Speichern der Daten muss ich eh ganz anders vorgehen und die Datei mit dem ersetzten Inhalt in Blöcken auf Disk schreiben. Mir also jede Memoryadresse merken, an der sich eine Fundstelle befindet, dann den Block davor binär in eine geöffnete Datei speichern, danach den Ersatzstring in die Datei schreiben, den Memorypointer in der Quelldatei hinter den Suchstring setzen und den nächsten Block binär in die Zieldatei schreiben (bis zum Auftreten einer weiteren Fundstelle, dann wiederholt sich das Spiel).
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.12 x64, OS: Win 11 24H2 x64, Desktopscaling: 150%, CPU: I7 12700 H, RAM: 32 GB, GPU: Intel(R) Iris(R) Xe Graphics | NVIDIA GeForce RTX 3070
Useralter in 2025: 57 Jahre.
Benutzeravatar
Kurzer
Beiträge: 1621
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Re: Frage zu Schreibweise [ ] und { } bei Array in Strukture

Beitrag von Kurzer »

STARGÅTE hat geschrieben:Im Prinzip möchtest du ja eine suche auf Byte-Ebene haben, somit musst du zwangsweise pro Byte suchen.
Hier könnte man zB ein unendliches Byte-Array nutzen:

Code: Alles auswählen

Structure ByteArray
	b.b[0]
EndStructure
Diese Struktur hat selbst keine größe, aber man kann durch sie schnell im Speicher per Index springen
Findet man solche kleinen Nettigkeiten in der Hilfe? Einige aus dem "harten Kern" haben oft gute Tipps, die man allein durch Studium der Hilfe nicht findet. Wie kommt man an solche Infos? :)
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.12 x64, OS: Win 11 24H2 x64, Desktopscaling: 150%, CPU: I7 12700 H, RAM: 32 GB, GPU: Intel(R) Iris(R) Xe Graphics | NVIDIA GeForce RTX 3070
Useralter in 2025: 57 Jahre.
Antworten