Это то, что я переписал после прочтения нескольких функций кодирования и декодирования Base64.
Поскольку в VBscript китайской операционной системы используется набор символов Юникода, многие функции кодирования и декодирования Base64 теоретически верны, но на практике они не могут работать!
Имя файла base64test.asp
<%
sBASE_64_CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
sBASE_64_CHARACTERS = strUnicode2Ansi(sBASE_64_CHARACTERS)
Функция strUnicodeLen(asContents)
'Рассчитываем длину кодировки Ansi строки Юникода
asContents1="a"&asContents
len1=len(asContents1)
к=0
для я = от 1 до len1
asc1=asc(mid(asContents1,i,1))
если по возрастанию1<0, то по возрастанию1=65536+по возрастанию1
если по возрастанию1>255, то
к=к+2
еще
к=к+1
конец, если
следующий
стрUnicodeLen=k-1
Конечная функция
Функция strUnicode2Ansi(asContents)
'Преобразовать строку в кодировке Unicode в строку в кодировке Ansi
стрUnicode2Ansi=""
len1=len(asContents)
для я = от 1 до len1
varchar=mid(asContents,i,1)
вараск = по возрастанию (varchar)
если varasc<0, то varasc=varasc+65536
если вараск>255, то
varHex=Hex(вараск)
варлоу = влево (varHex, 2)
varhigh = вправо (varHex, 2)
strUnicode2Ansi=strUnicode2Ansi & chrb("&H" & varlow ) & chrb("&H" & varhigh )
еще
strUnicode2Ansi=strUnicode2Ansi & chrb(varasc)
конец, если
следующий
Конечная функция
Функция strAnsi2Unicode(asContents)
'Преобразовать строку в кодировке Ansi в строку в кодировке Unicode
strAnsi2Unicode = ""
len1=lenb(asContents)
если len1=0, то выходим из функции
для я = от 1 до len1
varchar=midb(asContents,i,1)
вараск = ascb (varchar)
если вараск > 127, то
strAnsi2Unicode = strAnsi2Unicode & chr(ascw(midb(asContents,i+1,1) & varchar))
я=я+1
еще
strAnsi2Unicode = strAnsi2Unicode & chr(varasc)
конец, если
следующий
Конечная функция
Функция Base64encode(asContents)
'Base64 кодирует строку в кодировке Ansi
'asContents должна быть строкой в кодировке ANSI (двоичные строки также приемлемы)
Тусклое положение
Дим лсрезультат
Дим Чар1
Дим Чар2
Дим Чар3
Дим Чар4
Тусклый байт1
Тусклый байт2
Тусклый байт3
Тусклый SaveBits1
Тусклый SaveBits2
Dim lsGroupBinary
Дим lsGroup64
Dim m4,len1,len2
len1=Lenb(asContents)
если len1<1 тогда
Base64encode=""
выход из функции
конец, если
m3=Len1 Mod 3
Если M3 > 0, то asContents = asContents & String(3-M3, chrb(0))
'Количество дополнительных цифр должно облегчить расчет
ЕСЛИ м3 > 0 ТО
лен1=лен1+(3-м3)
лен2=лен1-3
еще
лен2=лен1
end if
lsResult = ""
Для lnPosition = 1 Для len2 Шаг 3
lsGroup64 = ""
lsGroupBinary = Midb(asContents, lnPosition, 3)
Byte1 = Ascb(Midb(lsGroupBinary, 1, 1)): SaveBits1 = Byte1 и 3
Байт2 = Ascb(Midb(lsGroupBinary, 2, 1)): SaveBits2 = Байт2 и 15
Байт3 = Ascb(Midb(lsGroupBinary, 3, 1))
Char1 = Midb(sBASE_64_CHARACTERS, ((Byte1 And 252) 4) + 1, 1)
Char2 = Midb(sBASE_64_CHARACTERS, (((Байт2 И 240) 16) Или (SaveBits1 * 16) И &HFF) + 1, 1)
Char3 = Midb(sBASE_64_CHARACTERS, (((Byte3 И 192) 64) Или (SaveBits2 * 4) И &HFF) + 1, 1)
Char4 = Midb(sBASE_64_CHARACTERS, (байт3 и 63) + 1, 1)
lsGroup64 = Char1 & Char2 & Char3 & Char4
lsResult = lsResult & lsGroup64
Далее
'Обработка последних нескольких оставшихся символов
если М3 > 0, то
lsGroup64 = ""
lsGroupBinary = Midb(asContents, len2+1, 3)
Byte1 = Ascb(Midb(lsGroupBinary, 1, 1)): SaveBits1 = Byte1 и 3
Байт2 = Ascb(Midb(lsGroupBinary, 2, 1)): SaveBits2 = Байт2 и 15
Байт3 = Ascb(Midb(lsGroupBinary, 3, 1))
Char1 = Midb(sBASE_64_CHARACTERS, ((Byte1 And 252) 4) + 1, 1)
Char2 = Midb(sBASE_64_CHARACTERS, (((Байт2 И 240) 16) Или (SaveBits1 * 16) И &HFF) + 1, 1)
Char3 = Midb(sBASE_64_CHARACTERS, (((Byte3 И 192) 64) Или (SaveBits2 * 4) И &HFF) + 1, 1)
если M3=1, то
lsGroup64 = Char1 & Char2 & ChrB(61) & ChrB(61) 'Используйте знак = для заполнения цифр
еще
lsGroup64 = Char1 & Char2 & Char3 & ChrB(61) 'Используйте знак = для составления цифр
конец, если
lsResult = lsResult & lsGroup64
конец, если
Base64encode = lsResult
Конечная функция
Функция Base64decode(asContents)
'Преобразуем строку в кодировке Base64 в строку в кодировке Ansi
'asContents также должен быть строкой в кодировке ANSI (двоичные строки также приемлемы)
Дим лсрезультат
Тусклое положение
Тусклый lsGroup64, lsGroupBinary
Тусклый Char1, Char2, Char3, Char4
Уменьшить Байт1, Байт2, Байт3
Dim M4,len1,len2
len1= Lenb(asContents)
M4 = len1 Mod 4,
если len1 < 1 или M4 > 0, то
'Длина строки должна быть кратна 4
Base64декод = ""
выход из функции
end if
'Определите, является ли последняя цифра знаком =
'Определяем, является ли предпоследняя цифра знаком =
'Здесь m4 представляет собой последнее оставшееся количество символов, которые необходимо обработать отдельно.
если Midb(asContents, len1, 1) = chrb(61), то m4=3
если Midb(asContents, len1-1, 1) = chrb(61), то m4=2,
если m4 = 0, то
лен2=лен1
еще
лен2=лен1-4
end if
For lnPosition = 1 To Len2 Шаг 4
lsGroupBinary = ""
lsGroup64 = Midb(asContents, lnPosition, 4)
Char1 = InStrb(sBASE_64_CHARACTERS, Midb(lsGroup64, 1, 1)) - 1
Char2 = InStrb(sBASE_64_CHARACTERS, Midb(lsGroup64, 2, 1)) - 1
Char3 = InStrb(sBASE_64_CHARACTERS, Midb(lsGroup64, 3, 1)) - 1
Char4 = InStrb(sBASE_64_CHARACTERS, Midb(lsGroup64, 4, 1)) - 1
Байт1 = Chrb(((Char2 И 48)16) Или (Char1 * 4) И &HFF)
Byte2 = lsGroupBinary & Chrb(((Char3 И 60) 4) Или (Char2 * 16) И &HFF)
Байт3 = Chrb((((Char3 и 3) * 64) и &HFF) Или (Char4 и 63))
lsGroupBinary = Байт1, Байт2 и Байт3
lsResult = lsResult & lsGroupBinary
Далее
'Обработка последних нескольких оставшихся символов
если М4 > 0, то
lsGroupBinary = ""
lsGroup64 = Midb(asContents, len2+1, m4) & chrB(65) 'chr(65)=A, преобразовано в значение 0
если M4=2, то «Добавьте 4 цифры для облегчения расчета».
lsGroup64 = lsGroup64 & chrB(65)
конец, если
Char1 = InStrb(sBASE_64_CHARACTERS, Midb(lsGroup64, 1, 1)) - 1
Char2 = InStrb(sBASE_64_CHARACTERS, Midb(lsGroup64, 2, 1)) - 1
Char3 = InStrb(sBASE_64_CHARACTERS, Midb(lsGroup64, 3, 1)) - 1
Char4 = InStrb(sBASE_64_CHARACTERS, Midb(lsGroup64, 4, 1)) - 1
Байт1 = Chrb(((Char2 И 48)16) Или (Char1 * 4) И &HFF)
Byte2 = lsGroupBinary & Chrb(((Char3 И 60) 4) Или (Char2 * 16) И &HFF)
Байт3 = Chrb((((Char3 и 3) * 64) и &HFF) Или (Char4 и 63))
если M4=2, то
lsGroupBinary = Байт1
иначе, если M4=3, то
lsGroupBinary = Байт1 и Байт2
конец, если
lsResult = lsResult & lsGroupBinary
конец, если
Base64decode = lsResult
Конечная функция