Aktuelle Zeit: 26.05.2013 06:06

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: FreeMemory Problem bei Base64
BeitragVerfasst: 07.03.2012 01:02 
Offline
Benutzeravatar

Registriert: 01.04.2007 20:18
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:
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.

_________________
Schlagt mich nicht, wenn ich falsch liege...
________________________________________________________________________________________________________________________
PureBasic 5.11 x86/x64 | Windows7 x64 | AMD X2 5600 | NVidia GTS 450


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: FreeMemory Problem bei Base64
BeitragVerfasst: 07.03.2012 01:17 
Offline
Kommando SG1
Benutzeravatar

Registriert: 01.11.2005 13:34
Wohnort: Glienicke
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()

_________________
Bild
 
BildBildBild


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: FreeMemory Problem bei Base64
BeitragVerfasst: 07.03.2012 01:23 
Offline
Benutzeravatar

Registriert: 01.04.2007 20:18
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 ;)

_________________
Schlagt mich nicht, wenn ich falsch liege...
________________________________________________________________________________________________________________________
PureBasic 5.11 x86/x64 | Windows7 x64 | AMD X2 5600 | NVidia GTS 450


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: FreeMemory Problem bei Base64
BeitragVerfasst: 07.03.2012 01:31 
Offline
Kommando SG1
Benutzeravatar

Registriert: 01.11.2005 13:34
Wohnort: Glienicke
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)

_________________
Bild
 
BildBildBild


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: FreeMemory Problem bei Base64
BeitragVerfasst: 07.03.2012 01:43 
Offline
Benutzeravatar

Registriert: 01.04.2007 20:18
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 ?

_________________
Schlagt mich nicht, wenn ich falsch liege...
________________________________________________________________________________________________________________________
PureBasic 5.11 x86/x64 | Windows7 x64 | AMD X2 5600 | NVidia GTS 450


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: FreeMemory Problem bei Base64
BeitragVerfasst: 07.03.2012 01:49 
Offline
Benutzeravatar

Registriert: 29.08.2004 13:29
Beim Lesen das Rückgabestrings solltest Du Peeks( *Output, Bytes, #PB_Ascii ) verwenden

_________________
Windows 8 / Windows 7 / Windows XP (als VM)
PB Last Final / Last Beta Testing


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: FreeMemory Problem bei Base64
BeitragVerfasst: 07.03.2012 01:52 
Offline
Kommando SG1
Benutzeravatar

Registriert: 01.11.2005 13:34
Wohnort: Glienicke
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.

_________________
Bild
 
BildBildBild


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: FreeMemory Problem bei Base64
BeitragVerfasst: 07.03.2012 02:36 
Offline
Benutzeravatar

Registriert: 01.04.2007 20:18
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 ;) )...

_________________
Schlagt mich nicht, wenn ich falsch liege...
________________________________________________________________________________________________________________________
PureBasic 5.11 x86/x64 | Windows7 x64 | AMD X2 5600 | NVidia GTS 450


Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye