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
Frage zu Schreibweise [ ] und { } bei Array in Strukturen
Frage zu Schreibweise [ ] und { } bei Array in Strukturen
"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.
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.
Re: Frage zu Schreibweise [ ] und { } bei Array in Strukture
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?
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
Re: Frage zu Schreibweise [ ] und { } bei Array in Strukture
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:
Diese Struktur hat selbst keine größe, aber man kann durch sie schnell im Speicher per Index springen:
Hast du dann das erste Byte gefunden, kannst du ein CompareMemory() nutzen, um den Rest des Such-Blocks zu vergleichen.
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]
EndStructureCode: 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
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
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
- 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
Zum Suchen würde ich den Knuth-Morris-Pratt-Algorithmus verwenden.
Re: Frage zu Schreibweise [ ] und { } bei Array in Strukture
Besten Dank für eure Hinweise.
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).
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.
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.
Re: Frage zu Schreibweise [ ] und { } bei Array in Strukture
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?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:Diese Struktur hat selbst keine größe, aber man kann durch sie schnell im Speicher per Index springenCode: Alles auswählen
Structure ByteArray b.b[0] EndStructure
"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.
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.