Seite 1 von 1

Probleme mit Val()

Verfasst: 22.08.2012 21:03
von Necro
Hallo zusammen :)

habe ein kleines Problem mit Val
Ich möchte GIF Bilder, die in einem Hex-String stecken zurück wandeln.
Habe eine kleine For Next Schleife die den String abarbeitet.
Leider tritt dabei ein kleines Problem auf:

Problem aus Hex 00 wird 20


Ich habe das GIF Bild einmal mit einem Editor von HEX nach ASCII konvertiert und dann als GIF gespeichert, klappt wunderbar.
Nun wollte ich das automatisieren, leider entsteht hier das besagte Problem, alle anderen Werte scheinen zu funktionieren.
Hat hier jemand evtl. eine Erklärung?
Auch die anderen Funktionen die man im Forum findet, aus der Zeit bevor es die Val() Funktion gab,
haben den gleichen Effekt.

Im Prinzip wird so gewandelt:
AUSZUG:
(Hatte ich so ähnlich hier im Forum oder Netz gefunden...)

Code: Alles auswählen

            For a = 1 To Len(hex_string)/2 Step 2
                    Debug (Chr(Val("$"+Mid(hex_string, a, 2))))                                 
                          mygif = mygif + Chr(Val("$"+Mid(hex_string, a, 2)))
           Next a



Re: Probleme mit Val()

Verfasst: 22.08.2012 21:31
von NicTheQuick
Du kannst in Strings sowieso keine Nullbytes schreiben. Du musst dafür einen Speicherbereich mit 'AllocateMemory()' allozieren.

Re: Probleme mit Val()

Verfasst: 23.08.2012 19:21
von Necro
NicTheQuick hat geschrieben:Du kannst in Strings sowieso keine Nullbytes schreiben. Du musst dafür einen Speicherbereich mit 'AllocateMemory()' allozieren.
Erstmal Danke für den Hinweis.

Hier habe ich das nun mit einer etwas abgewandelten Schleife versucht.
Etwas mit PokeS in den Speicher zu schreiben und mit PeekS wieder auszulesen ist einfach.
Allerdings habe ich hier nun das Problem das ich PokeS einen Pointer mitgeben müsste.
Ich möchte Wert für Wert nacheinander mit PokeS in den mit AllocateMemory() allozierten Speicherbereich schreiben.
Habe mir schon alle möglichen Anleitungen angeschaut, leider schaffe ich es nur einen ganzen String auf einmal in den Bereich zu schreiben,
aber nicht Wert für Wert nacheinander, da ich bisher nicht herausbekommen habe wie ich dies mit einem Pointer und PokeS erledigen kann.
Kann mir hier jemand auf die Sprünge helfen?

Re: Probleme mit Val()

Verfasst: 23.08.2012 19:32
von ts-soft
Als Anregung:

Code: Alles auswählen

EnableExplicit

Define i, *mem = AllocateMemory(58 + SizeOf(Character))
If *mem
  For i = 0 To 58
    PokeC(*mem + i, i + $41)
  Next
  ShowMemoryViewer(*mem, 58)
EndIf
Gruß
Thomas

Re: Probleme mit Val()

Verfasst: 23.08.2012 19:34
von STARGÅTE
Ich möchte Wert für Wert nacheinander mit PokeS in den mit AllocateMemory()
Und noch mal: PokeS() ist eine Fnuktion für String! und nur für Strings! und nicht für "Werte"

Hier eine sichere Variante:

Code: Alles auswählen

Structure AcsiiArray
	a.a[0]
EndStructure

HexString$ = "EEFFCCDDAABB88996677445522330011"

*Buffer.AcsiiArray = AllocateMemory(Len(HexString$)/2)
For I = Len(HexString$)/2-1 To 0 Step -1 ; ist schneller als 0 bis ..., weil nur einmal Len gemacht wird.
	*Buffer\a[I] = Val("$"+Mid(HexString$, I*2+1, 2))
Next

ShowMemoryViewer(*Buffer, MemorySize(*Buffer))

Re: Probleme mit Val()

Verfasst: 23.08.2012 20:20
von Necro
ts-soft hat geschrieben:Als Anregung:

Code: Alles auswählen

EnableExplicit

Define i, *mem = AllocateMemory(58 + SizeOf(Character))
If *mem
  For i = 0 To 58
    PokeC(*mem + i, i + $41)
  Next
  ShowMemoryViewer(*mem, 58)
EndIf
Gruß
Thomas
Poke erzeugt mit leider bei jedem Schleifendurchlauf ein null byte.
Aber der Hinweis war schonmal sehr gut. :) Danke :)

Re: Probleme mit Val()

Verfasst: 23.08.2012 20:23
von Necro
STARGÅTE hat geschrieben:
Ich möchte Wert für Wert nacheinander mit PokeS in den mit AllocateMemory()
Und noch mal: PokeS() ist eine Fnuktion für String! und nur für Strings! und nicht für "Werte"

Hier eine sichere Variante:

Code: Alles auswählen

Structure AcsiiArray
	a.a[0]
EndStructure

HexString$ = "EEFFCCDDAABB88996677445522330011"

*Buffer.AcsiiArray = AllocateMemory(Len(HexString$)/2)
For I = Len(HexString$)/2-1 To 0 Step -1 ; ist schneller als 0 bis ..., weil nur einmal Len gemacht wird.
	*Buffer\a[I] = Val("$"+Mid(HexString$, I*2+1, 2))
Next

ShowMemoryViewer(*Buffer, MemorySize(*Buffer))
Super, das ist perfekt, hat direkt funktioniert.
Jetzt hab ich das auch verstanden. Vielen Dank! :)