主要还是编码的问题。
通过解决这个问题,让我觉得字节是最完美的。- '参考链接:
- 'http://maclife.net/tools/base64/
- 'http://blog.csdn.net/zym_123456/archive/2008/03/30/2230695.aspx
- Option Explicit
-
- MsgBox Base64ToText_Utf8Encode("5om55aSE55CG5LmL5a62")
-
- 'Base64ToText_utf8Encode
- Function Base64ToText_Utf8Encode(s)
- Dim i
- Dim bArr,bRet
- ReDim bArr(Len(s)-1)
-
- For i=1 To Len(s)
- bArr(i-1)=Asc(Mid(s,i,1))
- Next
- bRet=Base64_Decode(bArr)
- Base64ToText_utf8Encode=Utf8ToUnicode(bRet)
- End Function
-
- 'Utf8ToUnicode
- Function Utf8ToUnicode(src)
- Dim IsAsc
- Dim utfLen
- utfLen = -1
-
- On Error Resume Next
- utfLen = UBound(src)-LBound(src)+1
- If utfLen = -1 Then Exit Function
- On Error GoTo 0
-
- Dim i,j,k,N
- Dim B,cnt
- ReDim Buf(utfLen)
- i = 1
- j = 0
- Do While i <= utfLen
- B = src(i-1)
- If (B And &HFC) = &HFC Then
- cnt = 6
- ElseIf (B And &HF8) = &HF8 Then
- cnt = 5
- ElseIf (B And &HF0) = &HF0 Then
- cnt = 4
- ElseIf (B And &HE0) = &HE0 Then
- cnt = 3
- ElseIf (B And &HC0) = &HC0 Then
- cnt = 2
- Else
- cnt = 1
- End If
- If i + cnt - 1 > utfLen Then
- Buf(j) = "?"
- Exit Do
- End If
- Select Case cnt
- Case 2
- N = B And &H1F
- Case 3
- N = B And &HF
- Case 4
- N = B And &H7
- Case 5
- N = B And &H3
- Case 6
- N = B And &H1
- Case Else
- Buf(j) = Chr(B)
- IsAsc=True
- End Select
- If IsAsc=False Then
- For k = 1 To cnt - 1
- B = src(i+k-1)
- N = N * &H40 + (B And &H3F)
- Next
- Buf(j) = ChrW(N)
- End If
- i = i + cnt
- j = j + 1
- IsAsc=False
- Loop
- Utf8ToUnicode = Join(Buf, "")
- End Function
-
- 'Base64解码函数
- Public Function Base64_Decode(bytInText)
- Dim Base64DecodeTable(122)
- Dim lngInTextLen, i
- Dim bytDecode, lngDecodeLen
-
- Base64_Decode = Chr(0) '初始化函数返回值
-
- If LBound(bytInText) <> 0 Then Exit Function 'bytInText数组下标不从零开始则出错返回
-
- lngInTextLen = UBound(bytInText) - LBound(bytInText) + 1 '计算bytInText数组长度
- If lngInTextLen Mod 4 <> 0 Then Exit Function '输入编码不是4的倍数则出错返回
-
- For i = 1 To 122 '初始化Base64解码表
- Select Case True
- Case i=43 '+
- Base64DecodeTable(i) = 62
- Case i=47 '/
- Base64DecodeTable(i) = 63
- Case i>=48 And i<=57 '0 - 9
- Base64DecodeTable(i) = 52 + (i - 48)
- Case i>=65 And i<=90 'A - Z
- Base64DecodeTable(i) = 0 + (i - 65)
- Case i>=97 And i<=122 'a - z
- Base64DecodeTable(i) = 26 + (i - 97)
- Case Else
- Base64DecodeTable(i) = 255
- End Select
- Next
- lngDecodeLen = lngInTextLen / 4 * 3 '求解码后的最大长度
- ReDim bytDecode(lngDecodeLen - 1) '重新定义解码缓冲区
- 'MsgBox "解码后的最大长度为:" & lngDecodeLen
-
- lngDecodeLen = 0 '初始化解码长度
-
- For i = 0 To lngInTextLen - 1 Step 4
- bytDecode(lngDecodeLen) = (Base64DecodeTable(bytInText(i)) * (2 ^ 2)) Or ((Base64DecodeTable(bytInText(i + 1)) And &H30) \ (2 ^ 4))
- bytDecode(lngDecodeLen + 1) = ((Base64DecodeTable(bytInText(i + 1)) And &HF) * (2 ^ 4)) Or ((Base64DecodeTable(bytInText(i + 2)) And &H3C) \ (2 ^ 2))
- bytDecode(lngDecodeLen + 2) = ((Base64DecodeTable(bytInText(i + 2)) And &H3) * (2 ^ 6)) Or Base64DecodeTable(bytInText(i + 3))
- lngDecodeLen = lngDecodeLen + 3
- Next
-
- If bytInText(lngInTextLen - 1) = &H3D Then '判断最后两个字节的情况,求解码后的实际长度
- If bytInText(lngInTextLen - 2) = &H3D Then
- lngDecodeLen = lngDecodeLen - 2 '最后两个字节为"="
- Else
- lngDecodeLen = lngDecodeLen - 1 '最后一个字节为"="
- End If
- bytDecode(lngDecodeLen) = 0 '在实际长度的后一个字节放个结束符
- End If
- 'MsgBox "解码后的实际长度为:" & lngDecodeLen
-
- Base64_Decode = bytDecode
- End Function
复制代码
|