Übersetzung von GFA Basic nach Purebasic

Anfängerfragen zum Programmieren mit PureBasic.
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: Übersetzung von GFA Basic nach Purebasic

Beitrag 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:
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
stevie1401
Beiträge: 700
Registriert: 19.10.2014 15:51
Kontaktdaten:

Re: Übersetzung von GFA Basic nach Purebasic

Beitrag 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.
Ich programmiere nur noch mit Linux.
Linux Mint 21.x
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
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: Übersetzung von GFA Basic nach Purebasic

Beitrag 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.
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: Übersetzung von GFA Basic nach Purebasic

Beitrag 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
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
stevie1401
Beiträge: 700
Registriert: 19.10.2014 15:51
Kontaktdaten:

Re: Übersetzung von GFA Basic nach Purebasic

Beitrag 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.
Ich programmiere nur noch mit Linux.
Linux Mint 21.x
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
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: Übersetzung von GFA Basic nach Purebasic

Beitrag 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.
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: Übersetzung von GFA Basic nach Purebasic

Beitrag 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:
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
stevie1401
Beiträge: 700
Registriert: 19.10.2014 15:51
Kontaktdaten:

Re: Übersetzung von GFA Basic nach Purebasic

Beitrag 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.
Ich programmiere nur noch mit Linux.
Linux Mint 21.x
Benutzeravatar
jojo1541
Beiträge: 431
Registriert: 15.09.2007 17:12
Wohnort: Irgendwo im Nirgendwo

Re: Übersetzung von GFA Basic nach Purebasic

Beitrag 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.
Ich verkaufe Rechtschreibfehler und jede menge GROßBUCHSTABEN. Alles unbegrenzt zu haben.
Benutzeravatar
HeX0R
Beiträge: 3040
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Re: Übersetzung von GFA Basic nach Purebasic

Beitrag von HeX0R »

stevie1401 hat geschrieben:Mit diesen beiden Proceduren en- und decode ich die Bilder.
[...]
Quellenangabe ...soviel Zeit muss sein.
Antworten