Seite 1 von 1

FreeMemory Problem bei Base64

Verfasst: 07.03.2012 01:02
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.

Re: FreeMemory Problem bei Base64

Verfasst: 07.03.2012 01:17
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()

Re: FreeMemory Problem bei Base64

Verfasst: 07.03.2012 01:23
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 ;)

Re: FreeMemory Problem bei Base64

Verfasst: 07.03.2012 01:31
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)

Re: FreeMemory Problem bei Base64

Verfasst: 07.03.2012 01:43
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 ?

Re: FreeMemory Problem bei Base64

Verfasst: 07.03.2012 01:49
von helpy
Beim Lesen das Rückgabestrings solltest Du Peeks( *Output, Bytes, #PB_Ascii ) verwenden

Re: FreeMemory Problem bei Base64

Verfasst: 07.03.2012 01:52
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.

Re: FreeMemory Problem bei Base64

Verfasst: 07.03.2012 02:36
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 ;) )...