Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Base64 en\de_code (http://forum.oszone.net/showthread.php?t=310203)

DarckSol 11-01-2016 10:03 2593348

Base64 en\de_code
 
vbs
Как реализовать?

Iska 11-01-2016 10:24 2593357

Примерно так: vbscript Base64 - Поиск в Google.

DarckSol 11-01-2016 11:16 2593365

Рабочее решение:
Код:

Function Base64Decode(ByVal base64String)
  Const Base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
  Dim dataLength, sOut, groupBegin
  base64String = Replace(base64String, vbCrLf, "")
  base64String = Replace(base64String, vbTab, "")
  base64String = Replace(base64String, " ", "")
  dataLength = Len(base64String)
  If dataLength Mod 4 <> 0 Then
    Err.Raise 1, "Base64Decode", "Bad Base64 string."
    Exit Function
  End If

  For groupBegin = 1 To dataLength Step 4
    Dim numDataBytes, CharCounter, thisChar, thisData, nGroup, pOut
    numDataBytes = 3
    nGroup = 0

    For CharCounter = 0 To 3
 
      thisChar = Mid(base64String, groupBegin + CharCounter, 1)

      If thisChar = "=" Then
        numDataBytes = numDataBytes - 1
        thisData = 0
      Else
        thisData = InStr(1, Base64, thisChar, vbBinaryCompare) - 1
      End If
      If thisData = -1 Then
        Err.Raise 2, "Base64Decode", "Bad character In Base64 string."
        Exit Function
      End If

      nGroup = 64 * nGroup + thisData
    Next

    nGroup = Hex(nGroup)

    nGroup = String(6 - Len(nGroup), "0") & nGroup

    pOut = Chr(CByte("&H" & Mid(nGroup, 1, 2))) + _
      Chr(CByte("&H" & Mid(nGroup, 3, 2))) + _
      Chr(CByte("&H" & Mid(nGroup, 5, 2)))
   

    sOut = sOut & Left(pOut, numDataBytes)
  Next

  Base64Decode = sOut
End Function
'Переменная, присвоение значения, вывод в сообщение результата'
dim result
result = Base64Decode("MTIzNDU=")
WScript.Echo(result)


greg zakharov 11-01-2016 17:02 2593504

Некоторое время назад писал для расширения кругозора пару функций:
Код:

Function ReadBytes(file)
  Dim objStream : Set objStream = CreateObject("SAPI.SpFileStream")
  Dim objFSO : Set objFSO = CreateObject("Scripting.FileSystemObject")
  Dim objBuff, intLength
 
  file = objFSO.GetAbsolutePathName(file)
  intLength = objFSO.GetFile(file).Size
 
  objStream.Open file, 0
  objStream.Read objBuff, intLength
  objStream.Close
 
  ReadBytes = objBuff
End Function

Function EncodeBase64(bytes)
  Dim objXml : Set objXml = CreateObject("Microsoft.XMLDOM")
  Dim objTmp : Set objTmp = objXml.createElement("tmp")
 
  objTmp.DataType = "bin.base64"
  objTmp.NodeTypedValue = bytes
  EncodeBase64 = objTmp.Text
End Function

Пример работы:
Код:

Dim objBytes

objBytes = ReadBytes("C:\src\myfile.txt")
WScript.Echo EncodeBase64(objBytes)

Декодирование осуществляется аналогично кодированию.
Пример из нынешней практики:
Код:

Dim strBase64, strRegular
Dim objEncoding : Set objEncoding = CreateObject("System.Text.UnicodeEncoding")
Dim objBytes : objBytes = objEncoding.GetBytes_4("Это тестовая строка")
Dim objXml : Set objXml = CreateObject("Microsoft.XMLDOM")
Dim objTmp : Set objTmp = objXml.createElement("tmp")

' кодирование
objTmp.DataType = "bin.base64"
objTmp.NodeTypedValue = objBytes
strBase64 = objTmp.Text
WScript.Echo strBase64

' декодирование
objTmp.Text = strBase64
strRegular = objTmp.NodeTypedValue
WScript.Echo strRegular

Iska, а Google - это не по-кодокапательски.

Iska 11-01-2016 21:08 2593631

greg zakharov, «как реализовать» — это не вопрос. Я же не просто отсылаю «в Google», а привожу точный запрос и проверяю его результаты.

greg zakharov 11-01-2016 21:32 2593644

Iska, предпочитаю Google спецификации, дизассемблирование и эксперименты с кодом, словом, простое кодокопательство.


Время: 02:01.

Время: 02:01.
© OSzone.net 2001-