[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
主要还是编码的问题。
通过解决这个问题,让我觉得字节是最完美的。
  1. '参考链接:
  2. 'http://maclife.net/tools/base64/
  3. 'http://blog.csdn.net/zym_123456/archive/2008/03/30/2230695.aspx
  4. Option Explicit
  5. MsgBox Base64ToText_Utf8Encode("5om55aSE55CG5LmL5a62")
  6. 'Base64ToText_utf8Encode
  7. Function Base64ToText_Utf8Encode(s)
  8. Dim i
  9. Dim bArr,bRet
  10. ReDim bArr(Len(s)-1)
  11. For i=1 To Len(s)
  12. bArr(i-1)=Asc(Mid(s,i,1))
  13. Next
  14. bRet=Base64_Decode(bArr)
  15. Base64ToText_utf8Encode=Utf8ToUnicode(bRet)
  16. End Function
  17. 'Utf8ToUnicode
  18. Function Utf8ToUnicode(src)
  19. Dim IsAsc
  20. Dim utfLen
  21. utfLen = -1
  22. On Error Resume Next
  23. utfLen = UBound(src)-LBound(src)+1
  24. If utfLen = -1 Then Exit Function
  25. On Error GoTo 0
  26. Dim i,j,k,N
  27. Dim B,cnt
  28. ReDim Buf(utfLen)
  29. i = 1
  30. j = 0
  31. Do While i <= utfLen
  32. B = src(i-1)
  33. If (B And &HFC) = &HFC Then
  34. cnt = 6
  35. ElseIf (B And &HF8) = &HF8 Then
  36. cnt = 5
  37. ElseIf (B And &HF0) = &HF0 Then
  38. cnt = 4
  39. ElseIf (B And &HE0) = &HE0 Then
  40. cnt = 3
  41. ElseIf (B And &HC0) = &HC0 Then
  42. cnt = 2
  43. Else
  44. cnt = 1
  45. End If
  46. If i + cnt - 1 > utfLen Then
  47. Buf(j) = "?"
  48. Exit Do
  49. End If
  50. Select Case cnt
  51. Case 2
  52. N = B And &H1F
  53. Case 3
  54. N = B And &HF
  55. Case 4
  56. N = B And &H7
  57. Case 5
  58. N = B And &H3
  59. Case 6
  60. N = B And &H1
  61. Case Else
  62. Buf(j) = Chr(B)
  63. IsAsc=True
  64. End Select
  65. If IsAsc=False Then
  66. For k = 1 To cnt - 1
  67. B = src(i+k-1)
  68. N = N * &H40 + (B And &H3F)
  69. Next
  70. Buf(j) = ChrW(N)
  71. End If
  72. i = i + cnt
  73. j = j + 1
  74. IsAsc=False
  75. Loop
  76. Utf8ToUnicode = Join(Buf, "")
  77. End Function
  78. 'Base64解码函数
  79. Public Function Base64_Decode(bytInText)
  80.     Dim Base64DecodeTable(122)
  81.     Dim lngInTextLen, i
  82.     Dim bytDecode, lngDecodeLen
  83.    
  84.     Base64_Decode = Chr(0)  '初始化函数返回值
  85.    
  86.     If LBound(bytInText) <> 0 Then Exit Function  'bytInText数组下标不从零开始则出错返回
  87.    
  88.     lngInTextLen = UBound(bytInText) - LBound(bytInText) + 1  '计算bytInText数组长度
  89.     If lngInTextLen Mod 4 <> 0 Then Exit Function  '输入编码不是4的倍数则出错返回
  90.    
  91.     For i = 1 To 122  '初始化Base64解码表
  92.         Select Case True
  93.         Case i=43  '+
  94.             Base64DecodeTable(i) = 62
  95.         Case i=47  '/
  96.             Base64DecodeTable(i) = 63
  97.         Case i>=48 And i<=57  '0 - 9
  98.             Base64DecodeTable(i) = 52 + (i - 48)
  99.         Case i>=65 And i<=90  'A - Z
  100.             Base64DecodeTable(i) = 0 + (i - 65)
  101.         Case i>=97 And i<=122  'a - z
  102.             Base64DecodeTable(i) = 26 + (i - 97)
  103.         Case Else
  104.             Base64DecodeTable(i) = 255
  105.         End Select
  106.     Next
  107.     lngDecodeLen = lngInTextLen / 4 * 3  '求解码后的最大长度
  108.     ReDim bytDecode(lngDecodeLen - 1)  '重新定义解码缓冲区
  109.     'MsgBox "解码后的最大长度为:" & lngDecodeLen
  110.    
  111.     lngDecodeLen = 0  '初始化解码长度
  112.    
  113.     For i = 0 To lngInTextLen - 1 Step 4
  114.         bytDecode(lngDecodeLen) = (Base64DecodeTable(bytInText(i)) * (2 ^ 2)) Or ((Base64DecodeTable(bytInText(i + 1)) And &H30) \ (2 ^ 4))
  115.         bytDecode(lngDecodeLen + 1) = ((Base64DecodeTable(bytInText(i + 1)) And &HF) * (2 ^ 4)) Or ((Base64DecodeTable(bytInText(i + 2)) And &H3C) \ (2 ^ 2))
  116.         bytDecode(lngDecodeLen + 2) = ((Base64DecodeTable(bytInText(i + 2)) And &H3) * (2 ^ 6)) Or Base64DecodeTable(bytInText(i + 3))
  117.         lngDecodeLen = lngDecodeLen + 3
  118.     Next
  119.    
  120.     If bytInText(lngInTextLen - 1) = &H3D Then  '判断最后两个字节的情况,求解码后的实际长度
  121.         If bytInText(lngInTextLen - 2) = &H3D Then
  122.             lngDecodeLen = lngDecodeLen - 2  '最后两个字节为"="
  123.         Else
  124.             lngDecodeLen = lngDecodeLen - 1  '最后一个字节为"="
  125.         End If
  126.         bytDecode(lngDecodeLen) = 0  '在实际长度的后一个字节放个结束符
  127.     End If
  128.     'MsgBox "解码后的实际长度为:" & lngDecodeLen
  129.    
  130.     Base64_Decode = bytDecode
  131. End Function
复制代码
1

评分人数

    • batman: 乐于助人PB + 2 技术 + 1

TOP

返回列表