Seite 1 von 1
ProgramParameter() Base64 ... Bug oder Denkfehler
Verfasst: 18.10.2015 18:13
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()
Re: ProgramParameter() Base64 ... Bug oder Denkfehler
Verfasst: 18.10.2015 18:47
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()
Re: ProgramParameter() Base64 ... Bug oder Denkfehler
Verfasst: 18.10.2015 19:02
von Imhotheb
Vielen Vielen Dank ... jetzt funktionierts
Re: ProgramParameter() Base64 ... Bug oder Denkfehler
Verfasst: 19.10.2015 10:29
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
Re: ProgramParameter() Base64 ... Bug oder Denkfehler
Verfasst: 19.10.2015 10:52
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)
Re: ProgramParameter() Base64 ... Bug oder Denkfehler
Verfasst: 19.10.2015 17:15
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.
Re: ProgramParameter() Base64 ... Bug oder Denkfehler
Verfasst: 19.10.2015 19:06
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
Re: ProgramParameter() Base64 ... Bug oder Denkfehler
Verfasst: 19.10.2015 20:41
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.