1 (изменено: dab00, 2014-01-30 11:29:14)

Тема: VBS: бинарный файл в base64

Всем привет. Решал вопрос, озвученный в заголовке. Вопрос: будет ли этот код работать во всех Windows начиная с XP.
Если у кого есть возможность, сообщите пожалуйста если ошибка вылетит. Вроде бы все должно, но мало ли. У меня на  8.1 х64 работает как надо.


' converter of binary into base64 and vise versa

errString = "Examples: " & vbCrLf & _
    "- binary into base64: " & WScript.ScriptName & _
    " -e myPicture.jpeg myDll.dll" & vbCrLf & _    
    "- base64 into binary: " & WScript.ScriptName & _
    " -d myPicture.jpeg.b64 myDll.dll.b64"

If WScript.Arguments.Count < 2 Then    
  WScript.Echo "Error: Not enough arguments" & vbCrLf & errString
  WScript.Quit
End If
wa = Right(LCase(WScript.Arguments(0)), 1)
If Not (wa = "e" Or wa = "d") Then  
  WScript.Echo "Error: Invalid named arguments" & vbCrLf & errString
  WScript.Quit
End If

Set fso = CreateObject("Scripting.FileSystemObject")
For i=1 To WScript.Arguments.Count - 1
  If Not fso.FileExists(WScript.Arguments(i)) Then
    WScript.Echo "Error: File " & WScript.Arguments(i) & " not found" & vbCrLf & errString
    WScript.Quit
  End If
  If wa = "e" Then WScript.Echo toBase64(WScript.Arguments(i))
  If wa = "d" Then WScript.Echo toBinary(WScript.Arguments(i))
Next

Function toBase64(file)  
  With CreateObject("ADODB.Stream")
    .Type = 1
    .Open
    .LoadFromFile(file)
    bytes = .Read    
  End With
  With CreateObject("Microsoft.XMLDOM").createElement("tmp")
    .DataType = "bin.base64"
    .NodeTypedValue = bytes
    base64 = .Text
  End With
  newfile = fso.GetFileName(fso.GetFile(file)) & ".b64"
  fso.CreateTextFile(newfile, True).Write(base64)  
  toBase64 = "toBase64: " & file & " >>> " & newfile & " : OK"
End Function

Function toBinary(file)
  With fso.OpenTextFile(file, 1)
    base64 = .ReadAll
    .Close
  End With
  With CreateObject("Microsoft.XMLDOM").createElement("tmp")
    .DataType = "bin.base64"    
    .Text = base64
    bytes = .NodeTypedValue
  End With
  With CreateObject("ADODB.Stream")
    .Type = 1
    .Open
    .Write bytes
    newfile = "new-" & Replace(fso.GetFileName(fso.GetFile(file)), ".b64", vbNullString)
    .SaveToFile newfile, 2
  End With
  toBinary = "toBinary: " & file & " >>> " & newfile & " : OK"
End Function

2 (изменено: Rumata, 2014-01-30 10:51:26)

Re: VBS: бинарный файл в base64

1. base64 файлы создаются в каталоге оригинального файла, а не в текущем калаоге
2. бинарные файлы создаются с префиксом "new-" ко всему пути, а не к имени файла


copy /b %COMSPEC% c:\Temp
cscript b64.vbs -t C:\Temp.cmd.exe
cscript b64.vbs -b C:\Temp\cmd.exe.b64

3. нестандартные для Windows ключи -t, -b (тире вместо привычного слеша /t, /b. Хотя разработчики из Рэдмонда сами же и не следуют правилу)
4. непонятен смысл ключа -t. Обычно когда что-то во что-то кодируют использют /encode, /e, -e. А когда декодируют - /decode, /d, -d.
5. жестко заданное имя программы в справке (WScript.ScriptName или WScript.ScriptFullName лучше. Нет?)

Конвертация bin->b64->bin прошла успешно (win7 Enterprise 64-bit SP1)

( 2 * b ) || ! ( 2 * b )

3 (изменено: dab00, 2014-01-30 11:31:45)

Re: VBS: бинарный файл в base64

Спасибо, Rumata. Все замечания по делу.
Код не претендует на готовое решение, меня больше интересует результат, т.к. планирую применить в одном приложении. Но постараюсь исправить недостатки - для красоты .

UPD: с учетом замечаний уважаемого Rumata исправил, спасибо еще раз, на счет префикса ключей - можно и слэш, по-моему так удобнее, кто-то привык --ключ

4

Re: VBS: бинарный файл в base64

OFF: только что потратил часа полтора на запуск WMI CIM Studio в IE11, отдельную тему заводить не буду, здесь расскажу что мне помогло, может кому сохраню время - нужно открыть studio.htm в текстовом редакторе и вставить в самое начало файла:


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<meta http-equiv="x-ua-compatible" content="IE=8" >

И сохранить изменения. Только так, никакие параметры просмотра в режиме совместимости или добавление хоста в зону мне не помогли. Такой вот "жесткий" рецепт .

5 (изменено: Rumata, 2014-01-30 16:16:28)

Re: VBS: бинарный файл в base64

На счет ключей (с тире или слешем). Сложно сказать, что лучше - тире или слеш. Так уж принято, что в винде изначально ключи идут со слешами, но есть несколько утилит, где используется тире (ping, netstat, ftp). У юникосвых утилит все ключи с тире или двойным тире (posix-формат).

А еще программно удобно обращаться к аргументам с помощью объекта WScript.Arguments.Unnamed, а к ключам - с WScript.Arguments.Named.

( 2 * b ) || ! ( 2 * b )

6

Re: VBS: бинарный файл в base64

Так не спорю же, согласен. Когда мне нужно было работать с Named/Unnamed аргументами, как здесь например, я использовал классический прием - слэш.
А здесь и аргументов то нет, если бы замутил на умняках - типа варианты расширения (в коде - '.b64') или префикс (в коде - 'new-') - дело другое.
Да и последнее время больше с линуксовым форматом приходится работать, вдруг перепутаю .

На самом деле спасибо, Rumata, сразу так все недостатки (или не все еще) нашли и разложили, все в точку.
Может на XP кто затестит, с парсером там проблем не будет? А еще Виста в природе иногда встречается...

7

Re: VBS: бинарный файл в base64

dab00 пишет:

будет ли этот код работать во всех Windows начиная с XP.

Работает:
Windows 7 HB, SP1, x64
VM VirtualBox чистая WinXP Professional SP3

dab00 пишет:

Такой вот "жесткий" рецепт .

Благодарю за патч - помогло.

Щт Уккщк Куыгьу Туче
’ҐЄгй п Є®¤®ў п бва Ёж : 1251

8

Re: VBS: бинарный файл в base64

Спасибо, omegastripes.

9

Re: VBS: бинарный файл в base64

На всякий случай. Тема в коллекции кодирование по алгоритму base64.

The gray Cardinal пишет:

Используются объекты MSXml2.DOMDocument и ADODB.Stream

Также приведены решения с использованием сторонних COM-объектов.

Забыл пароль и потерял e-mail.

10

Re: VBS: бинарный файл в base64

Спасибо, shiz. Меня бы устроил текущий вариант, без сторонних компонентов, лишь бы парсер Microsoft.XMLDOM оказался на всех осях начиная с XP.
Понятно что он шел еще с IE5 и логично ожидать, что имеет место быть во всех следующих, но мелкомягкие они такие...

11

Re: VBS: бинарный файл в base64

dab00
Microsoft.XMLDOM проверял на XP 32 SP2/3, W7 32/64, W8 32, W8.1 32: на этих работает, уверен, что и на остальных - тоже. За будущие не ручаюсь: мелкомягкие рекомендуют использовать MSXML2.DOMDocument, хотя он тоже, вроде, с XP...

12

Re: VBS: бинарный файл в base64

Спасибо, Serge Yolkin. На всякий случай пара ссылок по теме:
- Список версий модулей синтаксического анализа XML Microsoft (MSXML)
- MSXML Roadmap