Probleme mit Val()

Anfängerfragen zum Programmieren mit PureBasic.
Necro

Probleme mit Val()

Beitrag 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


Zuletzt geändert von Necro am 23.08.2012 19:16, insgesamt 1-mal geändert.
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

Re: Probleme mit Val()

Beitrag von NicTheQuick »

Du kannst in Strings sowieso keine Nullbytes schreiben. Du musst dafür einen Speicherbereich mit 'AllocateMemory()' allozieren.
Necro

Re: Probleme mit Val()

Beitrag 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?
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: Probleme mit Val()

Beitrag 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
Zuletzt geändert von ts-soft am 23.08.2012 19:35, insgesamt 1-mal geändert.
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
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Probleme mit Val()

Beitrag 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))
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
Necro

Re: Probleme mit Val()

Beitrag 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 :)
Zuletzt geändert von Necro am 23.08.2012 20:26, insgesamt 1-mal geändert.
Necro

Re: Probleme mit Val()

Beitrag 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! :)
Antworten