Asp:base64编码、解码函数

2005/6/16 22:22:54


阅读全文(1904) | 回复(0) | 编辑 | 精华

Asp:base64编码、解码函数在中文操作系统的VBscript中,使用的是unicode字符集,所以很多base64编码、解码函数在理论上是正确的,但实际不能运行! 文件名称base64test.asp <% sBASE_64_CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" sBASE_64_CHARACTERS = strUnicode2Ansi(sBASE_64_CHARACTERS) Function strUnicodeLen(asContents)'计算unicode字符串的Ansi编码的长度asContents1="a"&asContentslen1=len(asContents1)k=0for i=1 to len1asc1=asc(mid(asContents1,i,1))if asc1<0 then asc1=65536+asc1if asc1>255 thenk=k+2elsek=k+1end ifnextstrUnicodeLen=k-1End Function Function strUnicode2Ansi(asContents)'将Unicode编码的字符串,转换成Ansi编码的字符串strUnicode2Ansi=""len1=len(asContents)for i=1 to len1varchar=mid(asContents,i,1)varasc=asc(varchar)if varasc<0 then varasc=varasc+65536if varasc>255 thenvarHex=Hex(varasc)varlow=left(varHex,2)varhigh=right(varHex,2)strUnicode2Ansi=strUnicode2Ansi & chrb("&H" & varlow ) & chrb("&H" & varhigh )elsestrUnicode2Ansi=strUnicode2Ansi & chrb(varasc)end ifnextEnd function Function strAnsi2Unicode(asContents)'将Ansi编码的字符串,转换成Unicode编码的字符串strAnsi2Unicode = ""len1=lenb(asContents)if len1=0 then exit functionfor i=1 to len1varchar=midb(asContents,i,1)varasc=ascb(varchar)if varasc > 127 then strAnsi2Unicode = strAnsi2Unicode & chr(ascw(midb(asContents,i+1,1) & varchar))i=i+1elsestrAnsi2Unicode = strAnsi2Unicode & chr(varasc)end ifnextEnd function Function Base64encode(asContents) '将Ansi编码的字符串进行Base64编码'asContents应当是ANSI编码的字符串(二进制的字符串也可以)Dim lnPosition Dim lsResult Dim Char1 Dim Char2 Dim Char3 Dim Char4 Dim Byte1 Dim Byte2 Dim Byte3 Dim SaveBits1 Dim SaveBits2 Dim lsGroupBinary Dim lsGroup64 Dim m4,len1,len2 len1=Lenb(asContents)if len1<1 then Base64encode=""exit Functionend if m3=Len1 Mod 3 If M3 > 0 Then asContents = asContents & String(3-M3, chrb(0)) '补足位数是为了便于计算 IF m3 > 0 THEN len1=len1+(3-m3)len2=len1-3elselen2=len1end if lsResult = "" For lnPosition = 1 To len2 Step 3 lsGroup64 = "" lsGroupBinary = Midb(asContents, lnPosition, 3) Byte1 = Ascb(Midb(lsGroupBinary, 1, 1)): SaveBits1 = Byte1 And 3 Byte2 = Ascb(Midb(lsGroupBinary, 2, 1)): SaveBits2 = Byte2 And 15 Byte3 = Ascb(Midb(lsGroupBinary, 3, 1)) Char1 = Midb(sBASE_64_CHARACTERS, ((Byte1 And 252) \ 4) + 1, 1) Char2 = Midb(sBASE_64_CHARACTERS, (((Byte2 And 240) \ 16) Or (SaveBits1 * 16) And &HFF) + 1, 1) Char3 = Midb(sBASE_64_CHARACTERS, (((Byte3 And 192) \ 64) Or (SaveBits2 * 4) And &HFF) + 1, 1) Char4 = Midb(sBASE_64_CHARACTERS, (Byte3 And 63) + 1, 1) lsGroup64 = Char1 & Char2 & Char3 & Char4 lsResult = lsResult & lsGroup64 Next '处理最后剩余的几个字符if M3 > 0 thenlsGroup64 = "" lsGroupBinary = Midb(asContents, len2+1, 3) Byte1 = Ascb(Midb(lsGroupBinary, 1, 1)): SaveBits1 = Byte1 And 3 Byte2 = Ascb(Midb(lsGroupBinary, 2, 1)): SaveBits2 = Byte2 And 15 Byte3 = Ascb(Midb(lsGroupBinary, 3, 1)) Char1 = Midb(sBASE_64_CHARACTERS, ((Byte1 And 252) \ 4) + 1, 1) Char2 = Midb(sBASE_64_CHARACTERS, (((Byte2 And 240) \ 16) Or (SaveBits1 * 16) And &HFF) + 1, 1) Char3 = Midb(sBASE_64_CHARACTERS, (((Byte3 And 192) \ 64) Or (SaveBits2 * 4) And &HFF) + 1, 1) if M3=1 thenlsGroup64 = Char1 & Char2 & ChrB(61) & ChrB(61) '用=号补足位数elselsGroup64 = Char1 & Char2 & Char3 & ChrB(61) '用=号补足位数end if lsResult = lsResult & lsGroup64 end if Base64encode = lsResult End Function Function Base64decode(asContents) '将Base64编码字符串转换成Ansi编码的字符串'asContents应当也是ANSI编码的字符串(二进制的字符串也可以)Dim lsResult Dim lnPosition Dim lsGroup64, lsGroupBinary Dim Char1, Char2, Char3, Char4 Dim Byte1, Byte2, Byte3 Dim M4,len1,len2 len1= Lenb(asContents) M4 = len1 Mod 4 if len1 < 1 or M4 > 0 then'字符串长度应当是4的倍数Base64decode = "" exit Function end if '判断最后一位是不是 = 号'判断倒数第二位是不是 = 号'这里m4表示最后剩余的需要单独处理的字符个数if midb(asContents, len1, 1) = chrb(61) then m4=3 if midb(asContents, len1-1, 1) = chrb(61) then m4=2 if m4 = 0 thenlen2=len1elselen2=len1-4end if For lnPosition = 1 To Len2 Step 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 And 48) \ 16) Or (Char1 * 4) And &HFF) Byte2 = lsGroupBinary & Chrb(((Char3 And 60) \ 4) Or (Char2 * 16) And &HFF) Byte3 = Chrb((((Char3 And 3) * 64) And &HFF) Or (Char4 And 63)) lsGroupBinary = Byte1 & Byte2 & Byte3 lsResult = lsResult & lsGroupBinary Next '处理最后剩余的几个字符if M4 > 0 then lsGroupBinary = "" lsGroup64 = Midb(asContents, len2+1, m4) & chrB(65) 'chr(65)=A,转换成值为0if M4=2 then '补足4位,是为了便于计算 lsGroup64 = lsGroup64 & chrB(65) end ifChar1 = 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 And 48) \ 16) Or (Char1 * 4) And &HFF) Byte2 = lsGroupBinary & Chrb(((Char3 And 60) \ 4) Or (Char2 * 16) And &HFF) Byte3 = Chrb((((Char3 And 3) * 64) And &HFF) Or (Char4 And 63)) if M4=2 thenlsGroupBinary = Byte1elseif M4=3 thenlsGroupBinary = Byte1 & Byte2end if lsResult = lsResult & lsGroupBinary end if Base64decode = lsResult End Function 引自:http://www.ieee.org.cn/dispbbs.asp?boardID=43&ID=13614 原文出处不详!<完>参与讨论本主题

Qr

Posted by Qr on 2005/6/16 22:22:54


发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)
站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.750 second(s), page refreshed 144796156 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号