1

Тема: WSH: чтение и запись бинарных данных

Пример демонстрирует возможность сохранить бинарные данные в текстовом виде, так, чтобы этот текст не содержал непечатаемых символов. Пример считывает бинарный файл "infile" в строку и пишет её в текстовый файл. Затем считывает текстовый файл и создает бинарный файл "outfile".

<job>
 <script language="JScript">

 var fs =new ActiveXObject("Scripting.FilesystemObject");
 var ado=new ActiveXObject("ADODB.Stream");

 //1. считываем бинарный файл "infile" в строку и пишем её в текстовый файл
 with(ado)
 {
  type=2;
  charset='ibm866';
  open();
  loadFromFile("infile");
  var x=escape(readText());
  close();
 }

 // немного форматируем строку перед записью
 fs.openTextFile("textfile",2,true).write(x.replace(/(.{80})/g,"$1\r\n"));


 // 2. считываем текстовый файл и создаем бинарный файл "outfile"
 var x=fs.openTextFile("textfile",1).readAll();

 with(ado)
 {
  Type=2;
  charset='ibm866';
  open();
  writeText(unescape(x.replace(/\r\n/g,"")));
  saveToFile('outfile',2);
  close();
 }

 // 3. Проверяем:
 // C:\>fc /b infile outfile
 // Сравнение файлов infile и outfile
 // FC: различия не найдены

 </script>
</job>

Автор примера - fps.

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

2

Re: WSH: чтение и запись бинарных данных

Предыдущий пример в виде функции.
Добавлена небольшая "компрессия" - для типового .exe текстовый файл получается процентов на 30 компактнее (проверялось на explorer.exe).

<job>
 <script language="JScript">

 // кодируем файл infile в строку
 var x=binCode("infile");

 // записываем строку x в бинарный файл
 binCode("outfile",x);

 // записываем строку x в текстовый файл
 var fs =new ActiveXObject("Scripting.FilesystemObject");
 fs.openTextFile("textfile",2,true).write(x);


 function binCode(file,str)    // если str не задана, то возвращает в виде строки бинарный файл file
 {                // если str задана, то str запишется в бинарный файл file
  with(new ActiveXObject("ADODB.Stream"))
  {
   Type=2;
   charset='ibm866';
   open();
   if(str===undefined)
   {
    loadFromFile(file);
    var str=escape(readText()).replace(/%00(?=%)/g,"#").replace(/%u0/g,":").replace(/%u2/g,"=");
    return str.replace(/(.{80})/g,"$1\r\n");
   }
   else
   {
    str=str.replace(/\r\n/g,"").replace(/#/g,"%00").replace(/:/g,"%u0").replace(/=/g,"%u2");
    writeText(unescape(str));
    saveToFile(file,2);
   }
   close();
  }
 }

 </script>
</job>

Автор примера - fps.

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

3

Re: WSH: чтение и запись бинарных данных

Пример ниже (на VBScript) содержит процедуры конвертации битового массива в строку и наоборот. Скрипт читает бинарный файл input.jpg, преобразует его в строку и выводит её, затем читает эту строку и записывает её в бинарный файл output.jpg. Файл output.jpg будет точной копией файла input.jpg.

' Convert Byte-Array to VBScript ANSI string (c)Paul Randall
Function ByteArray2String(bArr)
    Dim OriginalLocale
    OriginalLocale = SetLocale("en-us")
    With CreateObject("ADODB.Stream")
        .Type = 1 'adTypeBinary
        .Open
        .Write bArr
        .Position = 0
        .Type = 2 'adTypeText
        .Charset = "windows-1251"
        ByteArray2String = .Readtext
    End With
    SetLocale OriginalLocale
End Function

'Convert VBScript ANSI string to Byte-Array (c)Paul Randall
Function String2ByteArray(str)
    Dim OriginalLocale
    OriginalLocale = SetLocale("en-us")
    With CreateObject("ADODB.Stream")
        .Type = 2 'adTypeText
        .Charset = "windows-1251"
        .Open
        .WriteText str, 0
        .Position = 0
        .Type = 1 'adTypeBinary
        String2ByteArray = .Read
    End With
    SetLocale OriginalLocale
End Function

Function ReadBinaryFile(filename)
    Dim bArr
    With CreateObject("ADODB.Stream")
        .Type = 1 'adTypeBinary
        .Open
        .LoadFromFile filename
        bArr = .Read
        .Close
        ReadBinaryFile = bArr
    End With
End Function

Function SaveBinaryData(filename, byteArray)
    Const adSaveCreateOverWrite = 2
    With CreateObject("ADODB.Stream")
        .Type = 1 'adTypeBinary
        .Open
        .Write byteArray
        .SaveToFile filename, adSaveCreateOverWrite
        .Close
    End With
End Function

'============================================================
' Проверка
file = "input.jpg"
file_out = "output.jpg"

Dim file, file_out, Arr, strArr, strHex, x, i
' Читаем бинарный файл и преобразуем его в строку из hex значений
Arr = ReadBinaryFile(file)
strArr = ByteArray2String(Arr)
strHex = ""
For i = 1 To Len(strArr)
    x = Hex(Asc(Mid(strArr, i, 1)))
    If Len(x) < 2 Then x = "0" & x
    strHex = strHex + x
Next
WScript.Echo strHex

' Читаем строку из hex значений и записываем её в бинарный файл
strArr = ""
For i = 1 To Len(strHex) Step 2
    strArr = strArr & Chr("&H" & Mid(strHex, i, 2))
Next
Arr = String2ByteArray(strArr)
SaveBinaryData file_out, Arr

'Можете сравнить входной и результирующий файл - они равны!

Автор примера — mozers.
Внимание! Данный код может быть опознан антивирусной программой как вирус, однако на самом деле это, конечно, не соответствует действительности.

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.