Seite 1 von 1

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

Verfasst: 20.01.2017 15:48
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

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

Verfasst: 20.01.2017 16:55
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?

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

Verfasst: 20.01.2017 20:30
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.

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

Verfasst: 20.01.2017 22:19
von NicTheQuick
Zum Suchen würde ich den Knuth-Morris-Pratt-Algorithmus verwenden.

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

Verfasst: 25.01.2017 00:02
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).

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

Verfasst: 26.01.2017 16:29
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? :)