找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 38418|回复: 12

[问题求助] VBS如何解码base64字符串

[复制链接]
发表于 2011-6-4 13:17:39 | 显示全部楼层 |阅读模式
UTF-8编码的“批处理之家”经过base64编码以后是“5om55aSE55CG5LmL5a62”,怎样从“5om55aSE55CG5LmL5a62”还原成“批处理之家”?
发表于 2011-6-4 14:05:35 | 显示全部楼层
网上早有人写好了,搜索一下就能得到:

  1. WScript.Echo  utf8to16(Base64Decode("5om55aSE55CG5LmL5a62"))

  2. Function utf8to16(str)
  3.     Dim out, i, len1, c, t
  4.     Dim char2, char3
  5.     out = ""
  6.     len1 = Len(str)
  7.     i = 0
  8.     While (i < len1)
  9.         c = Asc(Mid(str, i + 1, 1))
  10.         i = i + 1
  11.         t = c \ 16
  12.         If t >= 0 And t <= 7 Then
  13.             out = out + Mid(str, i, 1)
  14.         ElseIf t = 12 Or t = 13 Then
  15.             char2 = Asc(Mid(str, i + 1, 1))
  16.             i = i + 1
  17.             out = out + Chr(((c And 31) * 64) Or (char2 And 31))
  18.         ElseIf t = 14 Then
  19.             char2 = Asc(Mid(str, i + 1, 1))
  20.             i = i + 1
  21.             char3 = Asc(Mid(str, i + 1, 1))
  22.             i = i + 1
  23.             out = out + ChrW(((c And 15) * 4096) Or ((char2 And 63) * 64) Or ((char3 And 63)))
  24.         End If
  25.     Wend
  26.     utf8to16 = out
  27. End Function

  28. ' Decodes a base-64 encoded string (BSTR type).
  29. ' 1999 - 2004 Antonin Foller, http://www.motobit.com
  30. ' 1.01 - solves problem with Access And 'Compare Database' (InStr)
  31. Function Base64Decode(ByVal base64String)
  32.   'rfc1521
  33.   '1999 Antonin Foller, Motobit Software, http://Motobit.cz
  34.   Const Base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
  35.   Dim dataLength, sOut, groupBegin
  36.   
  37.   'remove white spaces, If any
  38.   base64String = Replace(base64String, vbCrLf, "")
  39.   base64String = Replace(base64String, vbTab, "")
  40.   base64String = Replace(base64String, " ", "")
  41.   
  42.   'The source must consists from groups with Len of 4 chars
  43.   dataLength = Len(base64String)
  44.   If dataLength Mod 4 <> 0 Then
  45.     Err.Raise 1, "Base64Decode", "Bad Base64 string."
  46.     Exit Function
  47.   End If

  48.   
  49.   ' Now decode each group:
  50.   For groupBegin = 1 To dataLength Step 4
  51.     Dim numDataBytes, CharCounter, thisChar, thisData, nGroup, pOut
  52.     ' Each data group encodes up To 3 actual bytes.
  53.     numDataBytes = 3
  54.     nGroup = 0

  55.     For CharCounter = 0 To 3
  56.       ' Convert each character into 6 bits of data, And add it To
  57.       ' an integer For temporary storage.  If a character is a '=', there
  58.       ' is one fewer data byte.  (There can only be a maximum of 2 '=' In
  59.       ' the whole string.)

  60.       thisChar = Mid(base64String, groupBegin + CharCounter, 1)

  61.       If thisChar = "=" Then
  62.         numDataBytes = numDataBytes - 1
  63.         thisData = 0
  64.       Else
  65.         thisData = InStr(1, Base64, thisChar, vbBinaryCompare) - 1
  66.       End If
  67.       If thisData = -1 Then
  68.         Err.Raise 2, "Base64Decode", "Bad character In Base64 string."
  69.         Exit Function
  70.       End If

  71.       nGroup = 64 * nGroup + thisData
  72.     Next
  73.    
  74.     'Hex splits the long To 6 groups with 4 bits
  75.     nGroup = Hex(nGroup)
  76.    
  77.     'Add leading zeros
  78.     nGroup = String(6 - Len(nGroup), "0") & nGroup
  79.    
  80.     'Convert the 3 byte hex integer (6 chars) To 3 characters
  81.     pOut = Chr(CByte("&H" & Mid(nGroup, 1, 2))) + _
  82.       Chr(CByte("&H" & Mid(nGroup, 3, 2))) + _
  83.       Chr(CByte("&H" & Mid(nGroup, 5, 2)))
  84.    
  85.     'add numDataBytes characters To out string
  86.     sOut = sOut & Left(pOut, numDataBytes)
  87.   Next

  88.   Base64Decode = sOut
  89. End Function
复制代码
 楼主| 发表于 2011-6-4 14:07:26 | 显示全部楼层
网上早有人写好了,搜索一下就能得到:
WScript.Echo  utf8to16(Base64Decode("5om55aSE55CG5LmL5a62"))

Function utf8to16(str)
    Dim out, i, len1, c, t
    Dim char2, char3
    out = ""
    len1 = ...
Spring 发表于 2011-6-4 14:05

复制粘贴之前起码验证一下吧,上面代码输出“???????????????”
发表于 2011-6-4 21:34:37 | 显示全部楼层
拿来主义啊................
发表于 2011-6-27 21:51:25 | 显示全部楼层
WScript.Echo binaryToText(base64ToBin("5om55aSE55CG5LmL5a62"), "utf-8")

评分

参与人数 1PB +2 技术 +1 收起 理由
batman + 2 + 1 你终于出手了

查看全部评分

 楼主| 发表于 2011-6-27 23:50:00 | 显示全部楼层
WScript.Echo binaryToText(base64ToBin("5om55aSE55CG5LmL5a62"), "utf-8")
zqz0012005 发表于 2011-6-27 21:51

  1. WScript.Echo "批处理之家"
复制代码
发表于 2011-6-28 00:23:01 | 显示全部楼层
6# Demon
五楼不是演示解密的。。。
发表于 2011-6-28 15:37:04 | 显示全部楼层
主要还是编码的问题。
通过解决这个问题,让我觉得字节是最完美的。

  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.        
  12.         For i=1 To Len(s)
  13.                 bArr(i-1)=Asc(Mid(s,i,1))
  14.         Next
  15.         bRet=Base64_Decode(bArr)
  16.         Base64ToText_utf8Encode=Utf8ToUnicode(bRet)
  17. End Function

  18. 'Utf8ToUnicode
  19. Function Utf8ToUnicode(src)
  20.         Dim IsAsc
  21.         Dim utfLen
  22.         utfLen = -1
  23.        
  24.         On Error Resume Next
  25.         utfLen = UBound(src)-LBound(src)+1
  26.         If utfLen = -1 Then Exit Function
  27.         On Error GoTo 0
  28.        
  29.         Dim i,j,k,N
  30.         Dim B,cnt
  31.         ReDim Buf(utfLen)
  32.         i = 1
  33.         j = 0
  34.         Do While i <= utfLen
  35.                 B = src(i-1)
  36.                 If (B And &HFC) = &HFC Then
  37.                         cnt = 6
  38.                 ElseIf (B And &HF8) = &HF8 Then
  39.                         cnt = 5
  40.                 ElseIf (B And &HF0) = &HF0 Then
  41.                         cnt = 4
  42.                 ElseIf (B And &HE0) = &HE0 Then
  43.                         cnt = 3
  44.                 ElseIf (B And &HC0) = &HC0 Then
  45.                         cnt = 2
  46.                 Else
  47.                         cnt = 1
  48.                 End If
  49.                 If i + cnt - 1 > utfLen Then
  50.                         Buf(j) = "?"
  51.                         Exit Do
  52.                 End If
  53.                 Select Case cnt
  54.                         Case 2
  55.                                 N = B And &H1F
  56.                         Case 3
  57.                                 N = B And &HF
  58.                         Case 4
  59.                                 N = B And &H7
  60.                         Case 5
  61.                                 N = B And &H3
  62.                         Case 6
  63.                                 N = B And &H1
  64.                         Case Else
  65.                                 Buf(j) = Chr(B)
  66.                                 IsAsc=True
  67.                 End Select
  68.                 If IsAsc=False Then
  69.                         For k = 1 To cnt - 1
  70.                                 B = src(i+k-1)
  71.                                 N = N * &H40 + (B And &H3F)
  72.                         Next
  73.                         Buf(j) = ChrW(N)
  74.                 End If
  75.                 i = i + cnt
  76.                 j = j + 1
  77.                 IsAsc=False
  78.         Loop
  79.         Utf8ToUnicode = Join(Buf, "")
  80. End Function

  81. 'Base64解码函数
  82. Public Function Base64_Decode(bytInText)
  83.     Dim Base64DecodeTable(122)
  84.     Dim lngInTextLen, i
  85.     Dim bytDecode, lngDecodeLen
  86.    
  87.     Base64_Decode = Chr(0)  '初始化函数返回值
  88.    
  89.     If LBound(bytInText) <> 0 Then Exit Function  'bytInText数组下标不从零开始则出错返回
  90.    
  91.     lngInTextLen = UBound(bytInText) - LBound(bytInText) + 1  '计算bytInText数组长度
  92.     If lngInTextLen Mod 4 <> 0 Then Exit Function  '输入编码不是4的倍数则出错返回
  93.    
  94.     For i = 1 To 122  '初始化Base64解码表
  95.         Select Case True
  96.         Case i=43  '+
  97.             Base64DecodeTable(i) = 62
  98.         Case i=47  '/
  99.             Base64DecodeTable(i) = 63
  100.         Case i>=48 And i<=57  '0 - 9
  101.             Base64DecodeTable(i) = 52 + (i - 48)
  102.         Case i>=65 And i<=90  'A - Z
  103.             Base64DecodeTable(i) = 0 + (i - 65)
  104.         Case i>=97 And i<=122  'a - z
  105.             Base64DecodeTable(i) = 26 + (i - 97)
  106.         Case Else
  107.             Base64DecodeTable(i) = 255
  108.         End Select
  109.     Next
  110.     lngDecodeLen = lngInTextLen / 4 * 3  '求解码后的最大长度
  111.     ReDim bytDecode(lngDecodeLen - 1)  '重新定义解码缓冲区
  112.     'MsgBox "解码后的最大长度为:" & lngDecodeLen
  113.    
  114.     lngDecodeLen = 0  '初始化解码长度
  115.    
  116.     For i = 0 To lngInTextLen - 1 Step 4
  117.         bytDecode(lngDecodeLen) = (Base64DecodeTable(bytInText(i)) * (2 ^ 2)) Or ((Base64DecodeTable(bytInText(i + 1)) And &H30) \ (2 ^ 4))
  118.         bytDecode(lngDecodeLen + 1) = ((Base64DecodeTable(bytInText(i + 1)) And &HF) * (2 ^ 4)) Or ((Base64DecodeTable(bytInText(i + 2)) And &H3C) \ (2 ^ 2))
  119.         bytDecode(lngDecodeLen + 2) = ((Base64DecodeTable(bytInText(i + 2)) And &H3) * (2 ^ 6)) Or Base64DecodeTable(bytInText(i + 3))
  120.         lngDecodeLen = lngDecodeLen + 3
  121.     Next
  122.    
  123.     If bytInText(lngInTextLen - 1) = &H3D Then  '判断最后两个字节的情况,求解码后的实际长度
  124.         If bytInText(lngInTextLen - 2) = &H3D Then
  125.             lngDecodeLen = lngDecodeLen - 2  '最后两个字节为"="
  126.         Else
  127.             lngDecodeLen = lngDecodeLen - 1  '最后一个字节为"="
  128.         End If
  129.         bytDecode(lngDecodeLen) = 0  '在实际长度的后一个字节放个结束符
  130.     End If
  131.     'MsgBox "解码后的实际长度为:" & lngDecodeLen
  132.    
  133.     Base64_Decode = bytDecode
  134. End Function
复制代码

评分

参与人数 1PB +2 技术 +1 收起 理由
batman + 2 + 1 乐于助人

查看全部评分

发表于 2011-6-28 21:47:29 | 显示全部楼层
幸好我在verybat收藏了zqz版主的binaryToText()、base64ToBin()、字符编码转换等很多常用函数。

既然版主没帖出来,我也不能越俎代庖。
发表于 2011-6-28 22:01:26 | 显示全部楼层
敝帚自珍的思想,要不得。
发表于 2011-7-12 20:31:04 | 显示全部楼层
9# powerbat

powerbat把代码都贴了吧,最好在“VBS原创&转载区”,让大家都学习学习。
发表于 2017-10-17 22:53:05 | 显示全部楼层
正好翻出来一个有意思的点 utf8 bom…
  1. Option Explicit

  2. WScript.Echo base64utf8("5om55aSE55CG5LmL5a62", False) & vbCrLf & _
  3.         base64utf8("批处理之家", True)

  4. '************************************************************************
  5. '字符串 Base64 编码、解码 (utf-8)
  6. '************************************************************************
  7. Function base64utf8(ByVal sText, ByVal bAsEncodeDecode)
  8.         Dim oStream, oXML, oNode
  9.         On Error Resume Next
  10.         Set oStream = CreateObject("ADODB.Stream")
  11.         Set oXML = CreateObject("Msxml2.DOMDocument.3.0")
  12.         Set oNode = oXML.CreateElement("base64")
  13.         oNode.DataType = "bin.base64"
  14.         base64utf8 = ""
  15.         If bAsEncodeDecode Then
  16.                 oStream.Type = 2        'adTypeText = 2
  17.                 oStream.Charset = "utf-8"
  18.                 oStream.Open
  19.                 oStream.WriteText sText
  20.                 oStream.Position = 0
  21.                 oStream.Type = 1        'adTypeBinary = 1
  22.                 oStream.Position = 0
  23.                 oNode.nodeTypedValue = oStream.Read
  24.                 If Err.Number = 0 Then
  25.                         base64utf8 = oNode.Text        '移除 utf-8 文件的 BMO头 efbbbf。base64_decode('77u/')
  26.                         If Left(base64utf8, 4) = "77u/" Then base64utf8 = Mid(base64utf8,5)
  27.                 End If
  28.         Else
  29.                 oStream.Type = 1        'adTypeBinary = 1
  30.                 oStream.Open
  31.                 oNode.Text = sText
  32.                 oStream.Write oNode.nodeTypedValue
  33.                 oStream.Position = 0
  34.                 oStream.Type = 2        'adTypeText = 2
  35.                 oStream.Charset = "utf-8"
  36.                 If Err.Number = 0 Then base64utf8 = oStream.ReadText
  37.         End If
  38.         Set oStream = Nothing
  39.         Set oNode = Nothing
  40.         Set oXML = Nothing
  41. End Function
复制代码
结果如下:
  1. ---------------------------
  2. Windows Script Host
  3. ---------------------------
  4. 批处理之家

  5. 5om55aSE55CG5LmL5a62
  6. ---------------------------
  7. 确定   
  8. ---------------------------
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 07:52 , Processed in 0.024734 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表