FreeMemory Problem bei Base64

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

FreeMemory Problem bei Base64

Beitrag von Bisonte »

Hallo.

Ich bin mit meinem Latein irgendwie grad am Ende.

Ich versuche gerade ein Base64 zu basteln das immer das gleiche raushaut, egal ob von ASCII oder Unicode Kompilat.

Ich Alloziiere einen Speicherbereich, prüfe ob er gültig ist, und wenn ich ihn freigeben will, meint der Compiler : MemoryID ungültig.
Allerdings nicht immer, es scheint mit der Länge des übergebenen Strings bzw. dessen Output zusammenzuhängen...

Hier mal die Prozeduren...

Code: Alles auswählen

Procedure.s mToBase64(String.s)
  
  Protected *Input
  Protected *OutPut
  Protected InputSize  = StringByteLength(String,#PB_Ascii)
  Protected OutPutSize = InputSize + (InputSize / 2)
  Protected Result.s = ""
  
  If Len(String) >= 1
    
    If OutPutSize < 64 : OutPutSize = 64 : EndIf

    *Input  = AllocateMemory(InputSize)
    *OutPut = AllocateMemory(OutPutSize)
    
    If *Input And *OutPut
      
      PokeS(*Input, String, -1, #PB_Ascii)
      
      Bytes = Base64Encoder(*Input, InputSize, *OutPut, OutPutSize)
      
      If Bytes
        Result = PeekS(*OutPut, -1, #PB_Ascii)
      EndIf
      
      FreeMemory(*Input)
      FreeMemory(*OutPut)  ; <-- Memory ID ungültig ?????
      
    EndIf 
  
  EndIf
  
  ProcedureReturn Result
  
EndProcedure
Procedure.s mFromBase64(String.s)
  
  Protected *Input
  Protected *OutPut
  Protected InputSize  = StringByteLength(String,#PB_Ascii)
  Protected OutPutSize = InputSize
  Protected Result.s = ""  
  
  If Len(String) >= 1
    
    If OutPutSize < 64 : OutPutSize = 64 : EndIf
    
    *Input  = AllocateMemory(InputSize)
    *OutPut = AllocateMemory(OutPutSize) ; <-- Speicher Alloziiert
    
    If *Input And *OutPut ; <-- Abfrage ob gültig
      
      PokeS(*Input, String, -1, #PB_Ascii)
      
      Bytes = Base64Decoder(*Input, InputSize, *OutPut, OutPutSize)
      
      If Bytes
        Result = PeekS(*OutPut, -1, #PB_Ascii)
      EndIf

      Debug *Output
      Debug OutPutSize
      
      FreeMemory(*Input)
      FreeMemory(*OutPut) ; <-- Memory ID ungültig ?????
      
    EndIf
    
  EndIf
  
  ProcedureReturn Result
  
EndProcedure


e.s = mToBase64("Größte Sprüche gehören verboten ! Das sollte aber nun ") ; <-- Dieser String verursacht MemID Error
d.s = mFromBase64(e)

; e.s = mToBase64("Größte Sprüche gehören verboten ! Das sollte aber nun nicht davon abhalten") ; <-- Dieser nicht
; d.s = mFromBase64(e)

Debug e
Debug d
Ich bin der Meinung, Speicher reservieren, prüfen, wenn richtig - nutzen und wieder freigeben....

Aber PB scheint nicht diese Meinung bei dem obigen Geschreibsel zu teilen. Was hab ich da also verissen ?

Edit: Unicode oder ASCII Kompilat ... es kommt bei beiden zu dem Problem.
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: FreeMemory Problem bei Base64

Beitrag von STARGÅTE »

Du machst den gleichen Fehler wie viele andere auch (ich selbst auch).

Du reservierst genau ein Zeichen zu wenig, nämlich das NULL-Zeichen, welches bei PokeS() zusätzlich geschrieben wird.

Reserviere also einfach AllocateMemory(InputSize+SizeOf(Character))

PS: Im übrigen würde dir, der Purifier weitere Infos geben, denn der meckert dann bei PokeS()
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
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Re: FreeMemory Problem bei Base64

Beitrag von Bisonte »

Faszinierend... das erklärt auch, warum das im Unicode Modus mit einem +1
einen Fehler verusachte und im Ascii Modus nicht...
(Das hatte ich vorher, weil bei StringByteLength was von "ohne Nullbyte" in der Hilfe stand)

Purifier ? Was ist das ? Wo ist das ?

Danke erstmal für diesen nächtlichen schubs in die richtige Richtung ;)
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: FreeMemory Problem bei Base64

Beitrag von STARGÅTE »

Wenn du PokeS(*Input, String, -1, #PB_Ascii) nutzt, dann wird auch im Unicode-Modus, nur ein Byte für die NULL geschrieben, da der String ja im Ascii geschrieben werden sollte.

Der Purifier (ganz unten) ist eine Art zusätzliches Überwachungsmodul, welches alle Schreib-Prozesse überwacht, ob diese in einem gültigen Bereich bleiben.
Du kannst ihn unter den Compiler-Optionen aktivieren (wird dann aber nur im Debugger-Modus mit kompliliert)
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
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Re: FreeMemory Problem bei Base64

Beitrag von Bisonte »

und das nächste Problem....

Ich habe nun " + SizeOf(Character) " an die beiden "Inputsize" berechnungen angehängt.
Jetzt ist allerdings die Ausgabe von der Prozedure mFromBase64() immer ein Leerstring.
ein Debug der Variable Bytes ergibt immer Null von dem Base64Decoder... Was läuft da jetzt falsch ?
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
helpy
Beiträge: 636
Registriert: 29.08.2004 13:29

Re: FreeMemory Problem bei Base64

Beitrag von helpy »

Beim Lesen das Rückgabestrings solltest Du Peeks( *Output, Bytes, #PB_Ascii ) verwenden
Windows 10
PB Last Final / (Sometimes testing Beta versions)
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: FreeMemory Problem bei Base64

Beitrag von STARGÅTE »

Nein nein Bisonte,

nicht InputSize um 1 Zeichen erhöhen, sonden nur beim AllocateMemory(InputSize+SizeOf(Character))!
Damit du auch weiterhin die richtige Länge in Base64 umwandelst.
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
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Re: FreeMemory Problem bei Base64

Beitrag von Bisonte »

Ok nun hab ich das gerafft ;)

@Helpy: Stimmt... obwohl es auch mit dem -1 dingens funktioniert... aber da ich das schon "auffange" kann ich das auch benutzen ;)

Danke und gute Nacht (is eindeutig zu spät ;) )...
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Antworten