bonjour,

pour illustrer un éventuel futur article sur l'utilisation des assemblies NET en vbscript, j'ai écris un petit exemple
sous la forme d'une classe qui exploite divers assemblies pour permettre l'encodage et le décodage de chaines au format Base64
c'est un poil plus lent qu'un code classique qui exploiterait l'objet "Microsoft.XMLDOM" (code managé oblige ) mais c'est de
l'ordre de quelques centièmes de secondes...

Les chaines accentuées au format UTF-8 sont supportées

la classe :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
' utiliser les NET assemblies System interopérables avec vbscript 1ère partie
' omen999 - https://omen999.developpez.com (juillet 2018)
' classe encodage et décodage en base64 
' ***************************************************************************
' syntaxe : Set oBase64 = New CNetBase64
' supporte les chaines au format UTF-8
' propriété - bCRLF : True insertion d'un CRLF tous les 76 caractères lors de l'encodage (valeur par défaut)
' méthodes - encode64(sdata) : renvoie une chaine au format base64 de la chaine sdata
'                decode64_str(data64) : renvoie une chaine décodée à partir d'une chaine data64 au format base64
'                decode64_bin(data64) : renvoie un tableau de bytes décodé à partir d'une chaine data64 au format base64
 
 
Class CNetBase64
Private oUTF8,oTB64,oFB64,oStream,aCRLF,aBytes
Public bCRLF
Private Sub Class_Initialize()
  Set oUTF8 = CreateObject("System.Text.UTF8Encoding")
  Set oTB64 = CreateObject("System.Security.Cryptography.ToBase64Transform")
  Set oFB64 = CreateObject("System.Security.Cryptography.FromBase64Transform")
  Set oStream = CreateObject("System.IO.MemoryStream")
  bCRLF = True : aCRLF = oUTF8.GetBytes_4(vbCrLf)	
End Sub
 
Public Function encode64(ByRef sdata)
Dim iOffset,i,iBSize
  aBytes = oUTF8.GetBytes_4(sdata)	
  iBSize = oTB64.InputBlockSize - ((oTB64.InputBlockSize - 1) \ (UBound(aBytes) + 1)) ' 3 ou moins si la chaine est plus courte
  For i = 0 To (UBound(aBytes) + 1) \ iBSize - 1
    iOffset = i * iBSize
    If (i > 0) And (i Mod 19 = 0) And bCRLF Then oStream.Write (aCRLF),0,2 ' lignes formatées à 76 cars
    oStream.Write oTB64.TransformFinalBlock((aBytes), iOffset, iBSize),0,4 ' toujours 4
  Next
  iOffset = iOffset + iBSize ' gestion du dernier bloc qui peut être tronqué
  If UBound(aBytes) >= iOffset Then oStream.Write oTB64.TransformFinalBlock((aBytes), iOffset, UBound(aBytes) - iOffset + 1),0,4
  encode64 = oUTF8.GetString(oStream.ToArray)
  oStream.SetLength 0
End Function
Public Function decode64_str(ByRef data64)
  aBytes = oFB64.TransformFinalBlock(oUTF8.GetBytes_4(data64),0,Len(data64))
  oStream.Write (aBytes),0,UBound(aBytes) + 1
  decode64_str = oUTF8.GetString(oStream.ToArray)
  oStream.SetLength 0
End Function
Public Function decode64_bin(ByRef data64)
  decode64_bin = oFB64.TransformFinalBlock(oUTF8.GetBytes_4(data64),0,Len(data64))
  oStream.SetLength 0
End Function
End Class
l'exemple :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
sTxt ="CHAPITRE I" & vbCrLf &_
"'Remontons-nous ?" & vbCrLf &_
"- Non ! Au contraire ! Nous descendons !" & vbCrLf &_
"- Pis que cela, monsieur Cyrus ! Nous tombons ! " & vbCrLf &_
" - Pour Dieu ! Jetez du lest ! " & vbCrLf &_
" - Voilà le dernier sac vidé ! " & vbCrLf &_
" - Le ballon se relève-t-il ? " & vbCrLf &_
" - Non ! " & vbCrLf &_
" - J'entends comme un clapotement de vagues ! " & vbCrLf &_
" - La mer est sous la nacelle ! " & vbCrLf &_
" - Elle ne doit pas être à cinq cents pieds de nous !' " & vbCrLf &_
" Alors une voix puissante déchira l'air, et ces mots " & vbCrLf &_
" retentirent : " & vbCrLf &_
" 'Dehors tout ce qui pèse !... tout ! et à la grâce " & vbCrLf &_
" de Dieu !' " & vbCrLf &_
" Telles sont les paroles qui éclataient en l'air, " & vbCrLf &_
" au-dessus de ce vaste désert d'eau du Pacifique, " & vbCrLf &_
" vers quatre heures du soir, dans la journée du " & vbCrLf &_
" 23 mars 1865. " & vbCrLf &_
" Personne n'a sans doute oublié le terrible coup de " & vbCrLf &_
" vent de nord-est qui se déchaîna au milieu de " & vbCrLf &_
" l'équinoxe de cette année, et pendant lequel le " & vbCrLf &_
" baromètre tomba à sept cent dix millimètres. Ce fut " & vbCrLf &_
" un ouragan, sans intermittence, qui dura du 18 au " & vbCrLf &_
" 26 mars. Les ravages qu'il produisit furent immenses " & vbCrLf &_
" en Amérique, en Europe, en Asie, sur une zone " & vbCrLf &_
" large de dix-huit cents milles, qui se dessinait " & vbCrLf &_
" obliquement à l'équateur, depuis le trente-cinquième " & vbCrLf &_
" parallèle nord jusqu'au quarantième parallèle sud ! " & vbCrLf &_
" Villes renversées, forêts déracinées, rivages " & vbCrLf &_
" dévastés par des montagnes d'eau qui se " & vbCrLf &_
" précipitaient comme des mascarets, navires jetés à la " & vbCrLf &_
" côte, que les relevés du  Bureau-Veritas  " & vbCrLf &_
" chiffrèrent par centaines, territoires entiers " & vbCrLf &_
" nivelés par des trombes qui broyaient tout sur leur " & vbCrLf &_
" passage, plusieurs milliers de personnes écrasées " & vbCrLf &_
" sur terre ou englouties en mer : tels furent les " & vbCrLf &_
" témoignages de sa fureur, qui furent laissés après " & vbCrLf &_
" lui par ce formidable ouragan. Il dépassait en " & vbCrLf &_
" désastres ceux qui ravagèrent si épouvantablement " & vbCrLf &_
" la Havane et la Guadeloupe, l'un le 25 octobre " & vbCrLf &_
" 1810, l'autre le 26 juillet 1825. " & vbCrLf &_
" Or, au moment même où tant de catastrophes " & vbCrLf &_
" s'accomplissaient sur terre et sur mer, un drame, " & vbCrLf &_
" non moins saisissant, se jouait dans les airs " & vbCrLf &_
" bouleversés. " & vbCrLf &_
" En effet, un ballon, porté comme une boule au sommet " & vbCrLf &_
" d'une trombe, et pris dans le mouvement giratoire " & vbCrLf &_
" de la colonne d'air, parcourait l'espace avec une " & vbCrLf &_
" vitesse de quatre-vingt-dix milles à l'heure, en " & vbCrLf &_
" tournant sur lui-même, comme s'il eût été saisi par " & vbCrLf &_
" quelque maelstrom aérien. " & vbCrLf &_
" Au-dessous de l'appendice inférieur de ce ballon " & vbCrLf &_
" oscillait une nacelle, qui contenait cinq passagers, " & vbCrLf &_
" à peine visibles au milieu de ces épaisses vapeurs, " & vbCrLf &_
" mêlées d'eau pulvérisée, qui traînaient jusqu'à la " & vbCrLf &_
" surface de l'Océan. Jules Verne - L'île mystérieuse"
 
Set oBase64 = New CNetBase64
'oBase64.bCRLF = False
sB64 = oBase64.encode64(sTxt)
Wscript.CreateObject("Wscript.Shell").Popup sB64
Wscript.CreateObject("Wscript.Shell").Popup oBase64.decode64_str(sB64)
toutes remarques sont les bienvenues