Encode et Decode en base45

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
GallyHC
Messages : 1703
Inscription : lun. 17/déc./2007 12:44

Encode et Decode en base45

Message par GallyHC »

Bonjour,

Suite à certaines recherches, j'ai eu besoin de pouvoir encoder et décoder en base45, j'ai donc fait un petit code pour cela. Je vous donne le code et cela pourra être utile à certains, s'ils recherchent des choses du contexte actuel.

Code : Tout sélectionner

Global.s charset = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:"

#BaseSize               = 45    ;
#BaseSizeSquared        = 45*45 ;
#EncodedChunkSize       = 3     ;
#ByteSize               = 256   ;

; ****************************************************************************

Procedure divmod(x.i, y.i, Array buffer(1))
  
  buffer(0) = Round(x / y, #PB_Round_Down)
  buffer(1) = x % y
  
EndProcedure

; ****************************************************************************

Procedure.s Encode(input.s)
  
  Define.i i
  Define.s result
  Dim Liste1(1)
  Dim Liste2(1)
  Dim buffer.i(Len(input))
  For i = 1 To Len(input)
    buffer(i - 1) = Asc(Mid(input, i, 1))
  Next i
  For i = 0 To ArraySize(buffer()) - 2 Step 2
    If ArraySize(buffer()) - i > 1
      Define.i x = (buffer(i) << 8) + buffer(i + 1)
      divmod(x, #BaseSizeSquared,  Liste1())
      divmod(Liste1(1), #BaseSize, Liste2())
      result + Mid(charset, Liste2(1) + 1, 1) + Mid(charset, Liste2(0) + 1, 1) + Mid(charset, Liste1(0) + 1, 1)
    Else
      divmod(buffer(i), #BaseSize, Liste1())
      result + Mid(charset, Liste1(1) + 1, 1) + Mid(charset, Liste1(0) + 1, 1)
    EndIf
  Next i
  ProcedureReturn result
  
EndProcedure

; ****************************************************************************

Procedure.s Decode(input.s)
  
  If input = #Null$
    ProcedureReturn #Null$    
  EndIf
  If Len(input) % #EncodedChunkSize = 1
    ProcedureReturn #Null$
  EndIf
  Define.i i
  Dim Liste1(1)
  Dim buffer.i(Len(input))
  For i = 1 To Len(input)
    Define.i p = FindString(charset, Mid(input, i, 1))
    If p > 0
      buffer(i - 1) + (p - 1)
    EndIf
  Next i
  Define.s result
  For i = 0 To ArraySize(buffer()) - 3 Step 3
    If ArraySize(buffer()) - i >= 3
      Define.i x = buffer(i) + buffer(i + 1) * #BaseSize + buffer(i + 2) * #BaseSizeSquared
      divmod(x, #ByteSize, Liste1())
      result + Chr(Liste1(0)) + Chr(Liste1(1))
    Else
      Define.i x = buffer(i) + buffer(i + 1) * #BaseSize
      result + Chr(x)
    EndIf
  Next i
  ProcedureReturn result

EndProcedure

; ****************************************************************************

Debug Encode("ceci est un test")
Debug Decode(Encode("ceci est un test"))
Cordialement,
GallyHC
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Encode et Decode en base45

Message par Kwai chang caine »

Hello Gally content de te lire :D
Ca marche ici et peut être utile :wink:
Merci de ce partage 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Shadow
Messages : 1373
Inscription : mer. 04/nov./2015 17:39

Re: Encode et Decode en base45

Message par Shadow »

Coucou et merci du partage, ça pourra servir c'est sur !
Mais quel est l'intérêt pour toi, tu va en faire quoi ?
Pourquoi 45 ?

A quoi ça sert ça ?

Code : Tout sélectionner

#BaseSize               = 45    ;
#BaseSizeSquared        = 45*45 ;
#EncodedChunkSize       = 3     ;
#ByteSize               = 256   ;
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.
Avatar de l’utilisateur
GallyHC
Messages : 1703
Inscription : lun. 17/déc./2007 12:44

Re: Encode et Decode en base45

Message par GallyHC »

Bonjour,

@Shadow > Si tu fais des recherches sur le contextes social actuel, tu trouveras l'intérêt.

Pour :

Code : Tout sélectionner

#BaseSize               = 45    ; Base 45 (45 caractères)
#BaseSizeSquared        = 45*45 ; Base au carré (Evite de devoir refaire le calcul)
#EncodedChunkSize       = 3     ; Encode sur 3 caractères.
#ByteSize               = 256   ; Bon la je penses que tu comprend
C'est des constantes utile au programme et qui permet de le faire évoluer. je ne vois pas trop ce que tu ne comprend pas la dedans ?

Cordialement,
GallyHC
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Répondre