Memory stückchenweise lesen

Anfängerfragen zum Programmieren mit PureBasic.
Alnet
Beiträge: 3
Registriert: 24.12.2010 22:03

Memory stückchenweise lesen

Beitrag von Alnet »

Hallo erstmal und fröhliche Weihnachten an alle <)
Was ich gerne wissen möchte ist wie man anhand einer Speicheradresse stückchenweise auslesen kann. Ich habe eine Datei mit Readdata() eingelesen und habe nun eine Speicheradresse in der meine Datei sich befindet. Nun frage ich mich ob es möglich ist nicht den kompletten Inhalt auszulesen sondern nur stückchenweise. Beispiel nach jedem Durchgang 1024 Bytes. Aber leider kriege ich das nicht hin. Hat jemand eine Lösung wie man die ersten 1024 Bytes liest und danach die nächsten 1024 Bytes und danach wieder die nächsten 1024 Bytes und so weiter?
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Re: Memory stückchenweise lesen

Beitrag von Thorium »

Hm, ich verstehe nicht ganz was du meinst.
Willst du die Datei stückenweise in den Speicher laden oder stückchenweise auf die Daten im Speicher zugreifen?
Wenn die Datei im Speicher ist, ist sie ja eingelesen. Kein Grund sie stückchenweise woanders einzulesen.

Nutze Pointer um auf die Daten im Speicher zuzugreifen.

Erklär mal genauer was du machen willst, wie willst du die Daten verarbeiten? Dann kann ich dir ein Codebeispiel basteln.
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Memory stückchenweise lesen

Beitrag von ts-soft »

Ungetested, aber ungefähr so:

Code: Alles auswählen

EnableExplicit

Define *mem, length, *buffer, i

*buffer = AllocateMemory(1024)

If ReadFile(1, "test.dat")
  length = Lof(1)
  *mem = AllocateMemory(length)
  If *mem
    ReadData(1, *mem, length)
    While i < length
      CopyMemory(*mem + i, *buffer, 1024)
      ; hier der code für die 1024 byte
      i + 1024
    Wend
    FillMemory(*buffer, 1024) ; 

    CopyMemory(*mem + i, *buffer, length - i)
    ; hier die restbytes
    FreeMemory(*mem)
  EndIf
  CloseFile(1)
EndIf
Frohes Fest
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Alnet
Beiträge: 3
Registriert: 24.12.2010 22:03

Re: Memory stückchenweise lesen

Beitrag von Alnet »

Ich habe eine Datei komplett in den Arbeitsspeicher geladen. Das ist auch so gewollt. Man kann nun mit einem Pointer auf die Daten zugreifen, aber irgendwie kann ich nicht bestimmen, wieviel und ab welcher Position ich gerne meine Daten der Datei lesen möchte. Es gibt Befehle wie PeekB(), PeekS() und so weiter, aber da kann man nur die Speicheradresse angeben aber nicht wieviele Bytes und ab welcher Position.

>Willst du die Datei stückenweise in den Speicher laden
Nein

>stückchenweise auf die Daten im Speicher zugreifen
Ja

Inhalt der Datei ist z.b. im Arbeitsspeicher folgendes: abcdefghijklmnopqrstuvwxyz0123456789

Nun möchte ich nicht den kompletten Inhalt im Arbeitsspeicher auslesen, sondern stückchenweise jede 10 Bytes:
1. abcdefghij
2. klmnopqrst
3. uvwxyz0123
4. 456789

Aber wie stelle ich das an?
Weist du jetzt was ich meine und kannst mir ein Beispielcode posten? :)
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Memory stückchenweise lesen

Beitrag von ts-soft »

Kannst Du meinem Beispiel entnehmen:
PeekB(*pointer + pos)
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Alnet
Beiträge: 3
Registriert: 24.12.2010 22:03

Re: Memory stückchenweise lesen

Beitrag von Alnet »

Danke :!:
Ich habe garnicht gewusst dass man bei der Speicheradresse + Position angeben kann.
Danke das wars.
~ thread is closed ~
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Memory stückchenweise lesen

Beitrag von STARGÅTE »

Auch wenn du dein Thema schon geschlossen hast, hier noch ein Paar Ideen:

Wenn du n Lange Zeichenkette im Speicher liegen hast, und immer genau 10Byte oder so haben willst, kannst du das auch mittels Strukture erledigen, ganz ohne Peek() und "Speichergehüpfe"

Code: Alles auswählen

Structure StringKette
  s.s{4}[0]
EndStructure

Beispiel.s = "MausBallLöweEnteGlas"
*Teil.StringKette = @Beispiel
Debug *Teil\s[0]
Debug *Teil\s[1]
Debug *Teil\s[4]
Ähnliches gilt natürlich wenn du eine Struktur in diesen 10Bytes hast, zB immer Long, Long, Word

Code: Alles auswählen

Structure Teil
  Long1.l
  Long2.l
  Word.w
EndStructure

Structure Kette
  Teil.Teil[0]
EndStructure


*Kette.Kette = AllocateMemory(1024)
*Kette\Teil[17]\Word = 123
*Kette\Teil[9]\Long1 = 123456

Debug *Kette\Teil[17]\Word 
Debug *Kette\Teil[9]\Long1 
Über das Array [] kannst du durch die Position wählen und dann direkt mittels Struktur Lesen.
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
Blackskyliner
Beiträge: 532
Registriert: 28.07.2005 00:54
Wohnort: /home/Blackskyliner/

Re: Memory stückchenweise lesen

Beitrag von Blackskyliner »

Gut zu wissen, sollte man auch mal in den Tipps und Tricks erwähnen :)
Keine meiner Antworten ist endgültig, es kann passieren, dass ich den so eben geposteten Beitrag noch mehrmals ändere, um Doppelposts zu umgehen.
_________________
Purebasic Windows 7 x64 & Linux (Ubuntu 10.04LTS) 4.50[x64|x86] Nutzer
_________________
Projekte: YAED - Yet another Event Dispatcher
Amor_2001
Beiträge: 75
Registriert: 14.12.2011 19:20

Re: Memory stückchenweise lesen

Beitrag von Amor_2001 »

Ich habe ein ähnliches aber nicht das gleiche Problem.
Ich lade eine Binärdatei in den Speicher und möchte sie nach einer bestimmten Zeichenkette durchsuchen.
Beispiel: Die Datei ist 36000 Byte groß und wird in den Speicher geladen.
Dann möchte ich herausfinden an welche Stelle der Datei die Zeichenkette "lkooiixxxx" steht.
Findstring funktioniert hier ja nicht. Habe es dann versucht über PEEKS in einen String zu kopieren.
Leider werden (vermutlich weil Binardatei) immer nur 4 Byte in den String kopiert.

Kann mir bitte jemand einen Tipp geben.

Danke!
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Memory stückchenweise lesen

Beitrag von ts-soft »

Guck mal in der Hilfe unter: CompareMemoryString() (Memorylib)
Wenn Du damit nicht klar kommst, kannste ja noch mal genauer (und möglichst mit Beispielcode) nachfragen.

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten