هذا ما أعدت كتابته بعد قراءة العديد من وظائف التشفير وفك التشفير لـ base64.
لأنه في VBscript لنظام التشغيل الصيني، يتم استخدام مجموعة أحرف Unicode، لذا فإن العديد من وظائف التشفير وفك التشفير لـ base64 صحيحة من الناحية النظرية، لكن لا يمكن تشغيلها عمليًا!
اسم الملف base64test.asp
<%
sBASE_64_CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
sBASE_64_CHARACTERS = strUnicode2Ansi(sBASE_64_CHARACTERS)
الدالة strUnicodeLen(asContents)
'احسب طول ترميز Ansi لسلسلة Unicode
asContents1="a"&asContents
لين1=لين(asContents1)
ك = 0
لأني = 1 إلى len1
تصاعدي = تصاعدي (منتصف (asContents1، ط، 1))
إذا كان asc1<0 ثم asc1=65536+asc1
إذا تصاعدي> 255 ثم
ك=ك+2
آخر
ك=ك+1
نهاية إذا
التالي
strUnicodeLen=k-1
وظيفة النهاية
وظيفة strUnicode2Ansi(asContents)
'تحويل السلسلة المشفرة بـ Unicode إلى سلسلة مشفرة بـ Ansi
strUnicode2Ansi = ""
len1=len(asContents)
لأني = 1 إلى len1
varchar=mid(asContents,i,1)
فاراسك = تصاعدي (فارشار)
إذا كان varasc<0 فإن varasc=varasc+65536
إذا فاراسك> 255 ثم
varHex=Hex(varasc)
فارلو = يسار (فارهيكس، 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)
فاراسك = تصاعدي (فارشار)
إذا فاراسك> 127 ثم
strAnsi2Unicode = strAnsi2Unicode & chr(ascw(midb(asContents,i+1,1) & varchar))
ط=ط+1
آخر
strAnsi2Unicode = strAnsi2Unicode & مركز حقوق الإنسان (فاراسك)
نهاية إذا
التالي
وظيفة النهاية
وظيفة Base64encode (كمحتويات)
'Base64 يقوم بتشفير السلسلة المشفرة بـ Ansi
'asContents يجب أن تكون سلسلة مشفرة ANSI (السلاسل الثنائية مقبولة أيضًا)
خافت الموقف
خافتة النتيجة
خافت Char1
خافت Char2
ديم شار3
خافت Char4
خافت بايت1
خافت بايت2
خافت بايت3
خافت SaveBits1
خافت SaveBits2
خافت lsGroupBinary
خافت lsGroup64
خافت m4,len1,len2
len1=Lenb(asContents)
إذا len1<1 ثم
كود Base64 = ""
وظيفة الخروج
النهاية إذا
m3=Len1 Mod 3
إذا كان M3 > 0 ثم asContents = asContents & String(3-M3, chrb(0))
'عدد الأرقام التكميلية هو لتسهيل الحساب
إذا كان m3 > 0 ثم
لين1=لين1+(3-م3)
لين2=لين1-3
آخر
len2=len1
end if
lsResult = ""
بالنسبة لـ lnPosition = 1 إلى len2 الخطوة 3
lsGroup64 = ""
lsGroupBinary = Midb(asContents, lnPosition, 3)
Byte1 = Ascb(Midb(lsGroupBinary, 1, 1)): SaveBits1 = Byte1 و3
Byte2 = Ascb(Midb(lsGroupBinary, 2, 1)): SaveBits2 = Byte2 و15
Byte3 = Ascb(Midb(lsGroupBinary, 3, 1))
Char1 = Midb(sBASE_64_CHARACTERS, ((Byte1 And 252) 4) + 1, 1)
Char2 = Midb(sBASE_64_CHARACTERS, (((Byte2 و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، (Byte3 و 63) + 1، 1)
lsGroup64 = Char1 & Char2 & Char3 & Char4
lsResult = lsResult & lsGroup64
التالي
'معالجة الأحرف القليلة الأخيرة المتبقية
إذا M3> 0 ثم
lsGroup64 = ""
lsGroupBinary = Midb(asContents, len2+1, 3)
Byte1 = Ascb(Midb(lsGroupBinary, 1, 1)): SaveBits1 = Byte1 و3
Byte2 = Ascb(Midb(lsGroupBinary, 2, 1)): SaveBits2 = Byte2 و15
Byte3 = Ascb(Midb(lsGroupBinary, 3, 1))
Char1 = Midb(sBASE_64_CHARACTERS, ((Byte1 And 252) 4) + 1, 1)
Char2 = Midb(sBASE_64_CHARACTERS, (((Byte2 و240) 16) أو (SaveBits1 * 16) و&HFF) + 1, 1)
Char3 = Midb(sBASE_64_CHARACTERS, (((Byte3 And 192) 64) أو (SaveBits2 * 4) And &HFF) + 1, 1)
إذا كان M3 = 1 إذن
lsGroup64 = Char1 & Char2 & ChrB(61) & ChrB(61) 'استخدم = علامة لملء الأرقام
آخر
lsGroup64 = Char1 & Char2 & Char3 & ChrB(61) 'استخدم = علامة لتكوين الأرقام
النهاية إذا
lsResult = lsResult & lsGroup64
end if
Base64encode = lsResult
End Function
وظيفة Base64decode (كمحتويات)
'تحويل السلسلة المشفرة Base64 إلى سلسلة مشفرة Ansi
'asContents يجب أن تكون أيضًا سلسلة مشفرة بواسطة ANSI (السلاسل الثنائية مقبولة أيضًا)
خافتة النتيجة
خافت الموقف
خافت lsGroup64، lsGroupBinary
خافت Char1، Char2، Char3، Char4
خافت بايت 1، بايت 2، بايت 3
خافت M4، len1، len2
len1 = Lenb (كمحتويات)
M4 = len1 Mod 4
إذا كان len1 < 1 أو M4 > 0 إذن
"يجب أن يكون طول السلسلة مضاعفًا للرقم 4."
Base64decode = ""
وظيفة الخروج
end if
'احكم على ما إذا كان الرقم الأخير = علامة
'حدد ما إذا كان الرقم قبل الأخير هو = علامة
'هنا يمثل m4 آخر عدد متبقي من الأحرف التي يجب معالجتها بشكل منفصل
إذا midb(asContents, len1, 1) = chrb(61) ثم m4=3
إذا midb(asContents, len1-1, 1) = chrb(61) ثم m4=2
إذا m4 = 0 ثم
len2=len1
آخر
len2=len1-4
end if
For lnPosition = 1 إلى 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
Byte1 = Chrb(((Char2 و 48) 16) أو (Char1 * 4) و &HFF)
Byte2 = lsGroupBinary & Chrb(((Char3 و60) 4) أو (Char2 * 16) و&HFF)
Byte3 = Chrb((((Char3 و 3) * 64) و &HFF) أو (Char4 و 63))
lsGroupBinary = Byte1 وByte2 وByte3
lsResult = lsResult وlsGroupBinary
التالي
'معالجة الأحرف القليلة الأخيرة المتبقية
إذا M4 > 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
Byte1 = Chrb(((Char2 و 48) 16) أو (Char1 * 4) و &HFF)
Byte2 = lsGroupBinary & Chrb(((Char3 و60) 4) أو (Char2 * 16) و&HFF)
Byte3 = Chrb((((Char3 And 3) * 64) و &HFF) أو (Char4 و 63))
إذا كان M4=2 إذن
lsGroupBinary = Byte1
وإلاسيف M4=3 إذن
lsGroupBinary = Byte1 وByte2
النهاية إذا
lsResult = lsResult & lsGroupBinary
end if
Base64decode = lsResult
End Function