Seite 1 von 1

StringField() auf Speicherblock anwendbar?

Verfasst: 22.10.2006 20:15
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?

Verfasst: 22.10.2006 20:22
von ts-soft
Die Daten dürfen kein NullByte enthalten, sonst kann StringField nicht
funktionieren. Ansonsten einfach StringField(PeekS(....

Verfasst: 22.10.2006 20:27
von Delle
Leider sind darin einige Nullbytes ;)

Verfasst: 22.10.2006 20:39
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

Verfasst: 22.10.2006 23:11
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