Marc
Nombre de messages : 2466 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
| Sujet: Codeur / décodeur Base64 et Base64URL Mer 27 Oct 2021 - 22:37 | |
| Bonjour à tous ! Suite à mon essai de codage en Base64, j’ai réalisé ce petit utilitaire qui code et décode la base64 et la base64URL. Oui, il est un peu "flashy" ! (clin d’œil à JJN4) - Code:
-
' Codage et décodage base64 et base64URL ' Marc - octobre 2021 dim base64$(63,1)
label redim, effacer1, effacer2, coder, decoder
interfaceUtilisateur() creerTableBase64()
end
effacer1: clear 4 clear 5 return
effacer2: clear 6 clear 7 return
coder: if number_click = 9 encodageBase64(0) sprite_text 5,"Texte codé en base64 :" sprite_position 5,325,42 else encodageBase64(1) sprite_text 5,"Texte codé en base64URL :" sprite_position 5,325,42 end_if return
decoder: decoderBase64() return
sub decoderBase64() dim_local b$, index%, car$, i%, carbin6$, chainebin$, carDec8%, carBin8$, txt$ clear 7 b$ = text$(6) for index% = 1 to len(b$) car$ = mid$(b$,index%,1) if car$ = "-" or car$ = "_" i% = instr("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_",car$) else i% = instr("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",car$) end_if if i% > 0 i% = i% - 1 ' conversion décimal vers binaire carBin6$ = "" while i% > 0 if frac(i% / 2) = 0 carBin6$ = "0" + carBin6$ else carBin6$ = "1" + carBin6$ end_if i% = INT(i% / 2) end_while ' formatage sur 6 bits while len(carBin6$) < 6 carBin6$ = "0" + carBin6$ end_while
chainebin$ = chainebin$ + carBin6$ end_if next index%
' lecture chaineBin$ par groupe de 8 octets for index% = 1 to len(chaineBin$) step 8 carDec8% = 0 carBin8$ = mid$(chaineBin$,index%,8) ' conversion binaire vers decimal WHILE carBin8$ <> "" carDec8% = (carDec8% * 2) + INSTR("01",LEFT$(carBin8$,1))-1 carBin8$ = RIGHT$(carBin8$,LEN(carBin8$)-1) END_WHILE
txt$ = txt$ + chr$(carDec8%) next index% text 7,txt$ end_sub
sub encodageBase64(type%) dim_local a$, b%, octet$, d$, e%, n%, m%, p%, groupe24Ascii$, groupe24binaire$, index%, texteBase64$, ajout$ clear 5 a$ = text$(4) if a$ = "" exit_sub end_if ' lecture de la chaine a$ par groupes de 24 bits (3 octets) for index% = 1 to len(a$) step 3 groupe24Ascii$ = mid$(a$,index%,3)
' conversion en binaire, de groupe24Ascii$ en groupe24binaire$ for n% = 1 to len(groupe24Ascii$) b% = asc(mid$(groupe24Ascii$,n%,1))
while b% > 0 if frac(b% / 2) = 0 octet$ = "0" + octet$ else octet$ = "1" + octet$ end_if b% = INT(b% / 2) end_while while len(octet$) < 8 octet$ = "0" + octet$ end_while
groupe24Binaire$ = groupe24Binaire$ + octet$ octet$ = "" next n%
' compléter groupe24Binaire$ jusqu'à concurrence de 24 bits if len(groupe24Binaire$) < 24 if len(groupe24Binaire$) = 16 groupe24Binaire$ = groupe24Binaire$ + "00" ajout$ = "=" else groupe24Binaire$ = groupe24Binaire$ + "0000" ajout$ = "==" end_if end_if
' lecture par groupe de 6 bits + codage for p% = 1 to len(groupe24binaire$) step 6 e% = 0 d$ = mid$(groupe24Binaire$,p%,6) WHILE d$ <> "" e% = (e% * 2) + INSTR("01",LEFT$(d$,1))-1 d$ = RIGHT$(d$,LEN(d$)-1) END_WHILE texteBase64$ = texteBase64$ + base64$(e%,type%) next p% groupe24Binaire$ = "" next index%
if type% = 0 text 5,texteBase64$ + ajout$ else text 5,texteBase64$ end_if end_sub
sub creerTableBase64() dim_local n% ' Deux bases 64 sont créées : ' base64 => base64$(_,0) ' base64URL => base64$(_,1)
for n% = 0 to 25 :' lettres majuscules "A" à "Z" base64$(n%,0) = chr$(65 + n%) base64$(n%,1) = chr$(65 + n%) next n%
for n% = 26 to 51 :' lettres minuscules "a" à "z" base64$(n%,0) = chr$(97 + n% - 26) base64$(n%,1) = chr$(97 + n% - 26) next n%
for n% = 52 to 61 :' chiffres de "0" à "9" base64$(n%,0) = chr$(48 + n% - 52) base64$(n%,1) = chr$(48 + n% - 52) next n%
base64$(62,0) = chr$(43) :' "+" base64$(62,1) = chr$(45) :' "-" base64$(63,0) = chr$(47) :' "/" base64$(63,1) = chr$(95) :' "_" end_sub
sub interfaceUtilisateur() caption 0,"Base64 : Coder et Décoder un texte" width 0,width(0) - width_client(0) + 600 height 0,height(0) - height_client(0) + 450 left 0,(screen_x - width(0)) / 2 top 0,(screen_y - height(0)) / 2 font_name 0,"Arial" font_size 0,"9" on_resize 0,redim
decorArrierePlan() memo 4 width 4,230 top 4,60 left 4,50 color 4,255,255,184 memo 5 width 5,230 top 5,60 left 5,320 color 5,255,255,184
memo 6 width 6,230 top 6,285 left 6,50 color 6,255,255,184 memo 7 width 7,230 top 7,285 left 7,320 color 7,255,255,184 button 9 top 9,175 left 9,85 width 9,130 caption 9,"Coder en base64" on_click 9,coder button 10 top 10,175 left 10,236 width 10,130 caption 10,"Coder en base64URL" on_click 10,coder
button 11 top 11,175 left 11,385 width 11,130 caption 11,"Effacer" on_click 11,effacer1 button 12 top 12,400 left 12,160 width 12,130 caption 12,"Décoder" on_click 12,decoder
button 13 top 13,400 left 13,310 width 13,130 caption 13,"Effacer" on_click 13,effacer2 legendes()
end_sub
sub decorArrierePlan() dim_local n% picture 1 width 1,600 height 1,450 scene2d 2 width 2,600 height 2,450 2d_target_is 1 for n% = 0 to 600 2d_pen_color 160,60,n%/3 2d_line n%,0,n%,225 next n% for n% = 0 to 600 2d_pen_color 0,60,200-n%/3 2d_line n%,225,n%,450 next n%
image 3 2d_image_copy 3,0,0,599,449 sprite 1 sprite_image_load 1,3 hide 1 end_sub
sub legendes() font_color 2,230,230,230 font_size 2,14
sprite 2 sprite_text 2,"Coder" sprite_position 2,20,10
sprite 3 sprite_text 3,"Décoder" sprite_position 3,20,235 font_color 2,255,255,255 font_size 2,10
sprite 4 sprite_text 4,"Tapez ou collez votre texte ici :" sprite_position 4,55,42
sprite 5 sprite_text 5,"Texte codé en base64 :" sprite_position 5,325,42
sprite 6 sprite_text 6,"Tapez ou collez votre texte ici :" sprite_position 6,55,267
sprite 7 sprite_text 7,"Texte décodé :" sprite_position 7,325,267 end_sub
redim: width 0,width(0) - width_client(0) + 600 height 0,height(0) - height_client(0) + 450 return
Pour le codage, vous avez le choix entre la Base64 et la Base64URL. Pour le décodage c’est automatique, le programme détecte la base à employer. | |
|