Base64:n tuseltaminen VBScriptillä
Tarvitsi hän Base64-dekooderi/enkooderin, joten sellaisen sitten kirjoitti. Alkuperäinen käyttö on tarkoitettu ASP-sivulle vääntelemään b64-koodattuja linkkejä. Modifioiminen komentoriville (CSCRIPT tai WSCRIPT) käy melko kätevästi - jollei testipätkää koodin lopussa tarvita, voidaan se sieltä poistaa, tahi korvata Response.Write:t WScript.Echolla.
const BASE_64_MAP_INIT="ABCDEFGHIJKLMNOPQRSTUVWXYZ_
abcdefghijklmnopqrstuvwxyz0123456789+/"
dim nl ' newline for output
dim Base64EncMap(63) ' zero based arrays
dim Base64DecMap(127)
' **************************************************************
' * must be called before using anything else
' **************************************************************
PUBLIC SUB initCodecs()
' init vars and setup base 64
nl=chr(13) & chr(10)
dim max, idx
max=len(BASE_64_MAP_INIT) ' one based string
for idx=0 to max - 1
Base64EncMap(idx)=mid(BASE_64_MAP_INIT, idx + 1, 1)
next
for idx=0 to max - 1
Base64DecMap(ASC(Base64EncMap(idx)))=idx
next
END SUB
' **************************************************************
' * encode base 64 encoded string
' **************************************************************
PUBLIC FUNCTION base64Encode(plain)
if len(plain)=0 then
base64Encode=""
exit function
end if
dim ret, ndx, by3, first, second, third
by3=(len(plain) \ 3) * 3
ndx=1
do while ndx <= by3
first=asc(mid(plain, ndx+0, 1))
second=asc(mid(plain, ndx+1, 1))
third =asc(mid(plain, ndx+2, 1))
ret=ret & Base64EncMap((first \ 4) AND 63 )
ret=ret & Base64EncMap(((first * 16) AND 48) + ((second \ 16) AND 15))
ret=ret & Base64EncMap(((second * 4) AND 60) + ((third \ 64) AND 3))
ret=ret & Base64EncMap(third AND 63)
ndx=ndx + 3
loop
' check for leftovers
if by3 < len(plain) then
first =asc(mid(plain, ndx+0, 1))
ret=ret & Base64EncMap( (first \ 4) AND 63 )
if (len(plain) MOD 3 )=2 then
second=asc(mid(plain, ndx+1, 1))
ret=ret & Base64EncMap(((first * 16) AND 48) + ((second \ 16) AND 15))
ret=ret & Base64EncMap(((second * 4) AND 60))
else
ret=ret & Base64EncMap((first * 16) AND 48)
ret=ret & "="
end if
ret=ret & "="
end if
base64Encode=ret
END FUNCTION
' **************************************************************
' * decode base 64 encoded string
' **************************************************************
PUBLIC FUNCTION base64Decode(scrambled)
if len(scrambled)=0 then
base64Decode=""
exit function
end if
' ignore padding
dim realLen
realLen=len(scrambled)
do while mid(scrambled, realLen, 1)="="
realLen=realLen - 1
loop
dim ret, ndx, by4, first, second, third, fourth
ret=""
by4=(realLen \ 4) * 4
ndx=1
do while ndx <= by4
first =Base64DecMap(asc(mid(scrambled, ndx+0, 1)))
second=Base64DecMap(asc(mid(scrambled, ndx+1, 1)))
third =Base64DecMap(asc(mid(scrambled, ndx+2, 1)))
fourth=Base64DecMap(asc(mid(scrambled, ndx+3, 1)))
ret=ret & chr(((first * 4) AND 255) + ((second \ 16) AND 3))
ret=ret & chr(((second * 16) AND 255) + ((third \ 4) AND 15))
ret=ret & chr(((third * 64) AND 255) + (fourth AND 63))
ndx=ndx + 4
loop
' check for leftovers, will be 2 or 3 characters
if ndx < realLen then
first =Base64DecMap(asc(mid(scrambled, ndx+0, 1)))
second=Base64DecMap(asc(mid(scrambled, ndx+1, 1)))
ret=ret & chr(((first * 4) AND 255) + ((second \ 16) AND 3))
if realLen MOD 4=3 then
third=Base64DecMap(asc(mid(scrambled,ndx+2,1)))
ret=ret & chr( ((second * 16) AND 255) + ((third \ 4) AND 15))
end if
end if
base64Decode=ret
END FUNCTION
' **************************************************************
' * initialize
' **************************************************************
call initCodecs
' Testing code
dim inp, encode
inp="Tässä on nimi/1/12/34/21/1"
encode=base64Encode(inp)
response.write "Encoded value=" & encode & nl
response.write "Decoded value=" & base64Decode(encode) & nl