StringField() auf Speicherblock anwendbar?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Delle
Beiträge: 1130
Registriert: 10.05.2005 22:48

StringField() auf Speicherblock anwendbar?

Beitrag von Delle »

Hallo,

ich habe eine binäre Datei in einen Speicherblock eingelesen...

Nun will ich diese Daten anhand eines vorhandenen Delimiters in kleinere Teile trennen und einzeln in ein Array schreiben...

StringField() bietet sich ja für sowas an, allerdings geht dies ja nur mit Strings und nicht mit Speicherblöcken :-(

Wie kann man schnellstmöglich einen Speicherblock wieder in einen String umwandeln? Mit einer Schleife und mittels Peek wieder zusammensetzen?
PB 6.21 | Win 11
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

Beitrag von ts-soft »

Die Daten dürfen kein NullByte enthalten, sonst kann StringField nicht
funktionieren. Ansonsten einfach StringField(PeekS(....
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
Benutzeravatar
Delle
Beiträge: 1130
Registriert: 10.05.2005 22:48

Beitrag von Delle »

Leider sind darin einige Nullbytes ;)
PB 6.21 | Win 11
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

Beitrag von ts-soft »

Mal ein kleines ungetestes skeleton:

Code: Alles auswählen

*Mem.Byte = AllocateMemory(1000)
; einlesen
For I = 0 To MemorySize(*Mem) -1
  Select *Mem\b + I
    Case ';' ; beispieltrenner
     ; tue was
    Case 0 ; ignorieren?
      Continue
    Default ; 
      ; füge zusammen
  EndSelect
  
Next
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
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
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

Beitrag von NicTheQuick »

Hier ein Beispiel. Ich hab der Einfachheit halber einen String als
Memory-Ersatz missbraucht:

Code: Alles auswählen

Procedure StringFieldMem(*Memory, Index.l, Separator.b, *length.Long)
  Protected *start, *c.Byte
  If *length\l = -1 : *length\l = MemorySize(*Memory) : EndIf
  If *length\l = 0 : ProcedureReturn #False : EndIf
  
  *c = *Memory
  *start = *c
  Repeat
    If *c\b = Separator
      If Index = 1 : Break : EndIf
      Index - 1
      *start = *c + 1
    EndIf
    
    *c + 1
  Until *c - *Memory = *length\l
  
  *length\l = *c - *start
  
  ProcedureReturn *start
EndProcedure

String.s = "Test;blubb;blabla"
length = Len(String)

*pos = StringFieldMem(@String, 4, ';', @length)

If *pos
  Debug PeekS(*pos, length)
EndIf
Antworten