Seite 2 von 3

Re: Übersetzung von GFA Basic nach Purebasic

Verfasst: 30.06.2015 21:55
von ts-soft
stevie1401 hat geschrieben:Genau Base64 will ich verhindern, da das nicht richtig auf einem Linux-vServer läuft.
Das verstehe ich nicht, wie ist das Gemeint? Die Base64 routinen in PB laufen überall gleich. Der verwendete Zeichensatz sollte auch keine Problem sein (7-Bit ASCII).

Da liegt wohl eher ein Fehler in Deinem Programm vor.

Gruß
Thomas

// huch, war wieder jemand schneller :lol:

Re: Übersetzung von GFA Basic nach Purebasic

Verfasst: 30.06.2015 22:16
von stevie1401
Base64 läuft NICHT auf meinen Ubuntu vServer, auf Windows läuft es einwandfrei.
Base 64 läuft auch NICHT auf einem normalen Ubuntu 32bit System.

Edit:
Auf einem 64bit vServer geht es schon deshalb nicht, weil Ubuntu grafic-libs haben möchte, wenn man was mit Base64 macht.

Da es auf Windows einwandfrei läuft, schliesse ich einen Fehler im Programm aus.
Unter GFA und Freebasic habe ich Images in einem String OHNE Base64 übertragen. Klar geht das.

Re: Übersetzung von GFA Basic nach Purebasic

Verfasst: 30.06.2015 22:24
von NicTheQuick
Base64 geht auf Linux wunderbar. Du machst falsch. ts-soft und ich sind Linux-Nutzer und haben keine Probleme damit.

Dass man in Strings keine Nullbytes speichern kann, wiederhole ich dann jetzt zum letzten Mal. Dass es in GFA-Basic oder Freebasic funktioniert, heißt nicht, dass es in Purebasic geht.

Re: Übersetzung von GFA Basic nach Purebasic

Verfasst: 30.06.2015 22:42
von ts-soft
stevie1401 hat geschrieben:Unter GFA und Freebasic habe ich Images in einem String OHNE Base64 übertragen. Klar geht das.
Weil die Sprachen OLE-Strings beherrschen, das heisst am Anfang eines Strings steht seine Länge. PureBasic beherrscht nur Nullterminierte Strings, das heißt die Länge ist erst bekannt, wenn PB auf einen NullChar trifft.
OLE-Strings kann man natürlich auch unter PB per API nutzen, aber das nutzt Dir unter Linux sowieso weniger.

Base64 hat auch rein garnichts mit Deinem vServer zu tun, der muß nichts besonderes können. PureBasic übernimmt die BASE64 codierung und endcodierung, siehe Cipher-Lib, deshalb haben auch die Ubuntu grafic-libs damit rein garnicht zu tun.

Ich weiß also nicht, was Du da machst, aber Base64 ist absolut OS-Unabhängig und funktioniert unter jedem OS gleich.
Wichtig ist nur, das Du beim entcodieren natürlich keinen String übergibst, wie das blöde Beispiel in der Hilfe, sondern
einen Speicherbereich in dem der String steht!

Ich hoffe mal Du raffst es jetzt :)

Gruß
Thomas

Re: Übersetzung von GFA Basic nach Purebasic

Verfasst: 30.06.2015 23:03
von stevie1401
Benutzt einer von euch base64 auf einem vServer?
Lest ihr eigentl was ich schreibe?
Mein Code läuft 1a unter windows. Nur unter Linux geht es nicht, seitdem ich Base64 benutze. Unter Windows geht Base64.

Ich kann morgen gerne mal den Code posten.

Re: Übersetzung von GFA Basic nach Purebasic

Verfasst: 30.06.2015 23:09
von NicTheQuick
stevie1401 hat geschrieben:Benutzt einer von euch base64 auf einem vServer?
Redest du dabei von dem BASE64-De- und Encoder von Purebasic oder allgemein?
Falls du allgemein meinst: So sieht es auf einem Virtual Linux Level 3 Server von Strato aus:

Code: Alles auswählen

root@hxxxxxxx:~# echo "Hallo Welt" | base64
SGFsbG8gV2VsdAo=
Und jetzt dekodieren:

Code: Alles auswählen

root@hxxxxxxx:~# echo "SGFsbG8gV2VsdAo=" | base64 -d
Hallo Welt
Das selbe kann auch Purebasic.

Code: Alles auswählen

Example$ = "Hallo Welt" + #LF$
Decoded$ = Space(1024) 
Encoded$ = Space(1024) 

Debug Base64Encoder(@Example$, StringByteLength(Example$), @Encoded$, 1024)
Debug Encoded$ 

Debug Base64Decoder(@Encoded$, StringByteLength(Encoded$), @Decoded$, 1024)
Debug Decoded$
Ergebnis:

Code: Alles auswählen

16
SGFsbG8gV2VsdAo=
11
Hallo Welt
Und ob der Server nun virtuell ist oder nicht, spielt zumindest dabei keine Rolle. Selbst bei Paravirtualisierung hast du da keine Einschränkung im Vergleich zu einem Root-Server.

Re: Übersetzung von GFA Basic nach Purebasic

Verfasst: 30.06.2015 23:17
von ts-soft
stevie1401 hat geschrieben:Benutzt einer von euch base64 auf einem vServer?
Was sollte der vServer damit zu tun haben? Rein garnichts!

Das Server-Programm, was Du geschrieben hast, soll nur Strings übertragen können! Wie die Kodiert sind, ist dem Server erstmal egal.
Es kommen nur 7-Bit ASCII Zeichen an, also von ASCII 32 - ASCII 127.

Und bevor Du zum wasweißichwievielten Mal mit Deinem vServer kommst, der hat damit wirklich nicht zu tun. Probiere es doch mal mit Localhost, da wirste denselben Fehler haben, der nunmal in Deinem Code ist und den wir nicht kennen.

Okay, ich muß schlafen, muß morgen wieder Früh raus,

Thomas

// nachtrag:
@NicTheQuick
Jetzt hast Du natürlich das dämliche Beispiel aus der Hilfe genommen, welches Strings encodiert, statt Speicherbereiche, so lernt er es nie :mrgreen:

Re: Übersetzung von GFA Basic nach Purebasic

Verfasst: 01.07.2015 09:37
von stevie1401
Mit diesen beiden Proceduren en- und decode ich die Bilder.

Code: Alles auswählen

Procedure.s EncodeImageToString(*ImageFromMemory, SizeOfImage)
   Protected Result.s, Length
   
   ;wir holen uns mehr als genug speicher, wir haben's ja...
   Result = Space(64 + SizeOfImage * 1.5)
   Length = Base64Encoder(*ImageFromMemory, SizeOfImage, @Result, Len(Result))
   CompilerIf #PB_Compiler_Unicode
      Result = PeekS(@Result, Length, #PB_Ascii)
   CompilerElse
      Result = Left(Result, Length)
   CompilerEndIf
   
   ProcedureReturn Result
EndProcedure


 
 
 Procedure DecodeStringToImage(String.s)
   Protected *Buffer, L, *StringAscii, Image
   
   *Buffer = AllocateMemory(Len(String)) ;Die Binärdatei ist IMMER kleiner, als der String, egal, wir kümmern uns nicht darum.
   If *Buffer
      CompilerIf #PB_Compiler_Unicode ;Obacht bei Unicode! Base64Decode benötigt den String in Ascii!
         *StringAscii = AllocateMemory(StringByteLength(String, #PB_Ascii))
         If *StringAscii
            PokeS(*StringAscii, String, -1, #PB_Ascii | #PB_String_NoZero)
            L = Base64Decoder(*StringAscii, MemorySize(*StringAscii), *Buffer, MemorySize(*Buffer))
            FreeMemory(*StringAscii)
         EndIf
       CompilerElse
         
         ;Alles easy, kein Unicode
         L = Base64Decoder(@String, Len(String), *Buffer, MemorySize(*Buffer))
      CompilerEndIf
      
      If L
        Image = CatchImage(#PB_Any, *Buffer, L)
      EndIf
      FreeMemory(*Buffer)
   EndIf
   
   ProcedureReturn Image
EndProcedure
 
 


Wenn der Doko-Server unter Linux (mit Fenstern) an die Clients sendet, bleibt er spätestens nach dem dritten Bild hängen und nichts passiert mehr.
Wenn der Doko-Server unter WINDOWS an die Clients sendet, funktioniert alles wunderbar. (Exakt gleicher Code wie unter Linux).

Der Befehl "SAVEIMAGE ()" benötigt unter Linux eine Fensterverwaltung und ist somit NICHT für einen vServer geeignet.
Gegenteilige Behauptungen möge man mir bitte mit kleinem Code beweisen.

Thema ist für mich erledigt.
Ich lasse den Server auf Windows laufen.

Re: Übersetzung von GFA Basic nach Purebasic

Verfasst: 01.07.2015 14:22
von jojo1541
Wenn du dir ein Bild (mit Header) aus dem Speicher holst, warum dann noch den umweg über CatchImage/SaveImage gehen? Schreib direkt aus dem Speicher in eine Datei und dein Problem ist gelöst.

Re: Übersetzung von GFA Basic nach Purebasic

Verfasst: 01.07.2015 15:09
von HeX0R
stevie1401 hat geschrieben:Mit diesen beiden Proceduren en- und decode ich die Bilder.
[...]
Quellenangabe ...soviel Zeit muss sein.