ProgramParameter() Base64 ... Bug oder Denkfehler

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Imhotheb
Beiträge: 192
Registriert: 10.10.2014 13:14
Computerausstattung: Intel 8086, 640 KB RAM, Hercules Video Adapter, 2 x 5 1/4" 360kb Floppy, MS-DOS 3
Wohnort: Wolfenbüttel

ProgramParameter() Base64 ... Bug oder Denkfehler

Beitrag von Imhotheb »

Hallo Zusammen,

irgendwie habe ich ein seltsames Problem ... sitze schon seit einiger Zeit daran und so langsam gehen mir die Ideen aus.

Der Zweck ist einfach ... ich möchte einfach eine base64-codierte Url als Programmparameter übergeben ... folgenden Code habe ich in allen erdenklichen Variationen versucht (mit Ascii, Unicode, Utf8)

Weiß jemand Rat?

Code: Alles auswählen

; Folgender Parameter wird verwenden ...
; aAB0AHQAcABzADoALwAvAG4AbwB0AGUAcABhAGQALQBwAGwAdQBzAC0AcABsAHUAcwAuAG8AcgBnAC8AcgBlAHAAbwBzAGkAdABvAHIAeQAvADYALgB4AC8ANgAuADgALgAzAC8AbgBwAHAALgA2AC4AOAAuADMALgBkAGkAZwBlAHMAdAAuAHMAaABhADEA
; Executable Win, 32Bit, Unicode, Threadsafe and modern Theme

Procedure.s GetParamUrl()
  Protected Base64Size, Base64Url.s, UrlSize, Url.s
  
  If CountProgramParameters()
    Base64Url = ProgramParameter()
    If Base64Url
      UrlSize = StringByteLength(Base64Url)
      Url = Space(Len(Base64Url))
      Base64Size = Base64Decoder(@Base64Url, UrlSize, @Url, UrlSize)
      Debug Base64Size
      If Base64Size
        ProcedureReturn PeekS(@Url, Base64Size) ;, #PB_Ascii)
      EndIf
    EndIf            
  EndIf 
  
  ProcedureReturn ""
EndProcedure

Debug GetParamUrl()
weil einfach einfach einfach ist ... mach' ich es anders
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: ProgramParameter() Base64 ... Bug oder Denkfehler

Beitrag von GPI »

base64 arbeitet immer mit ascii-strings - unicode würde da auch keinen Sinn machen. Diese info fehlt in der Documentation.

Code: Alles auswählen

; Folgender Parameter wird verwenden ...
; aAB0AHQAcABzADoALwAvAG4AbwB0AGUAcABhAGQALQBwAGwAdQBzAC0AcABsAHUAcwAuAG8AcgBnAC8AcgBlAHAAbwBzAGkAdABvAHIAeQAvADYALgB4AC8ANgAuADgALgAzAC8AbgBwAHAALgA2AC4AOAAuADMALgBkAGkAZwBlAHMAdAAuAHMAaABhADEA
; Executable Win, 32Bit, Unicode, Threadsafe and modern Theme

Procedure.s GetParamUrl(rettype=#PB_Unicode )
  Protected Base64Size, Base64Url.s,asc_len,*mem,*memout
  Protected ret.s
  ret=""
  If CountProgramParameters()
    Base64Url = ProgramParameter()
    If Base64Url<>""
      UrlSize = StringByteLength(Base64Url)
      
      asc_len=StringByteLength(base64url,#PB_UTF8)
      *mem=AllocateMemory(asc_len*2+4);0 byte von ersten string, nullbyte von unicode +1 reserve
      *memout=*mem+asc_len
      PokeS(*mem,Base64Url,asc_len,#PB_Ascii)
      
      Base64Size = Base64Decoder(*mem,asc_len,*memout,asc_len)
      
      
      Debug Base64Size
      If Base64Size
        ret=PeekS(*memout,Base64Size,rettype)
        
      EndIf
      FreeMemory(*mem)
    EndIf           
  EndIf
 
  ProcedureReturn ret
EndProcedure

Debug GetParamUrl()
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Benutzeravatar
Imhotheb
Beiträge: 192
Registriert: 10.10.2014 13:14
Computerausstattung: Intel 8086, 640 KB RAM, Hercules Video Adapter, 2 x 5 1/4" 360kb Floppy, MS-DOS 3
Wohnort: Wolfenbüttel

Re: ProgramParameter() Base64 ... Bug oder Denkfehler

Beitrag von Imhotheb »

Vielen Vielen Dank ... jetzt funktionierts
weil einfach einfach einfach ist ... mach' ich es anders
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: ProgramParameter() Base64 ... Bug oder Denkfehler

Beitrag von ts-soft »

GPI hat geschrieben:base64 arbeitet immer mit ascii-strings - unicode würde da auch keinen Sinn machen. Diese info fehlt in der Documentation.
base64 arbeitet überhaupt nicht mit strings, sondern mit speicherbereichen (memorys). ASCII oder Unicode macht da keinen Unterschied,
wenn richtig angewendet.
Lediglich die Umwandlung geschieht nach ASCII-7-Bit, damit diese dargestellt werden kann.
Die Beispiele sollten da mal angepaßt werden und Speicherbereiche genutzt, statt Strings.

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
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Re: ProgramParameter() Base64 ... Bug oder Denkfehler

Beitrag von Bisonte »

wenn wir schon dabei sind....
PB-Hilfe hat geschrieben:#PB_Cipher_NoPadding: es wird am Ende des kodierten Puffers kein zusätzliches '=' eingefügt, um es auf die 3 Bytes-Grenze zu "padden"
Was genau heisst das ?
Und was genau soll mir diese : ' um es auf die 3 Bytes-Grenze zu "padden" ' Aussage mitteilen ?
Heisst es jetzt, dass es immer bestimmte Blockgrössen gibt, die ich irgendwie ab/auffangen müsste ?
(Geht um die Verständnisfrage ... also kein konkretes Beispiel)
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: ProgramParameter() Base64 ... Bug oder Denkfehler

Beitrag von STARGÅTE »

Base64 heißt ja, dass aus einem 256-Wertebereich ein 64-Wertebereich gemacht wird.
Mit anderen Worten, aus 8 Bit sollen nur noch 6 Bit werden. Da aber 8 Bit nicht in 6 Bit passen (irgendwie logisch) werden also 3 Byte (3 * 8 Bit) in 4 Byte (4 * 6 Bit) konvertiert.
Wenn nun aber die Speichergröße kein Vielfaches von 3 ist, müssen Bits aufgefüllt werden, damit die Konvertierung funktioniert.
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
HeX0R
Beiträge: 3042
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: ProgramParameter() Base64 ... Bug oder Denkfehler

Beitrag von HeX0R »

ts-soft hat geschrieben:
GPI hat geschrieben:base64 arbeitet immer mit ascii-strings - unicode würde da auch keinen Sinn machen. Diese info fehlt in der Documentation.
base64 arbeitet überhaupt nicht mit strings, sondern mit speicherbereichen (memorys). ASCII oder Unicode macht da keinen Unterschied,
wenn richtig angewendet.
Lediglich die Umwandlung geschieht nach ASCII-7-Bit, damit diese dargestellt werden kann.
Die Beispiele sollten da mal angepaßt werden und Speicherbereiche genutzt, statt Strings.

Gruß
Thomas
Allerdings fände ich es besser, wenn der String im Unicodemodus auch als Unicode-String herauskommt.
Ich meine, der Hauptgrund für base64 ist Binärdateien in einen String ohne Krimskrams umzuwandeln, um z.B. Datenbanken o.ä. damit zu füttern ohne rumblobben zu müssen (wobei die Datenbanken meist dann auch base64 anwenden für Blobs).
Da wäre es sinnvoller den String auch gleich in einem lesbaren Format zurückzugeben damit man ihn nicht erst umständlich umwandeln muss.

Oder gleich richtig machen:
http://www.purebasic.fr/english/viewtop ... =3&t=48920
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: ProgramParameter() Base64 ... Bug oder Denkfehler

Beitrag von ts-soft »

Also so:

Code: Alles auswählen

Base64Encoder(*EingabePuffer, EingabeGröße, Ausgabe.s [, Flags])
Base64Decoder(Eingabe.s, *AusgabePuffer, AusgabeGröße)
Ja, wäre besser, wenn Fred das umsetzen würde. Gäbe weniger Probleme.
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
Antworten