<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; WSH: чтение и запись бинарных данных]]></title>
	<link rel="self" href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=1226&amp;type=atom" />
	<updated>2009-11-03T16:36:49Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=1226</id>
		<entry>
			<title type="html"><![CDATA[Re: WSH: чтение и запись бинарных данных]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=30067#p30067" />
			<content type="html"><![CDATA[<p>Пример ниже (на VBScript) содержит процедуры конвертации битового массива в строку и наоборот. Скрипт читает бинарный файл input.jpg, преобразует его в строку и выводит её, затем читает эту строку и записывает её в бинарный файл output.jpg. Файл output.jpg будет точной копией файла input.jpg.<br /></p><div class="codebox"><pre><code>&#039; Convert Byte-Array to VBScript ANSI string (c)Paul Randall
Function ByteArray2String(bArr)
    Dim OriginalLocale
    OriginalLocale = SetLocale(&quot;en-us&quot;)
    With CreateObject(&quot;ADODB.Stream&quot;)
        .Type = 1 &#039;adTypeBinary
        .Open
        .Write bArr
        .Position = 0
        .Type = 2 &#039;adTypeText
        .Charset = &quot;windows-1251&quot;
        ByteArray2String = .Readtext
    End With
    SetLocale OriginalLocale
End Function

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

Function ReadBinaryFile(filename)
    Dim bArr
    With CreateObject(&quot;ADODB.Stream&quot;)
        .Type = 1 &#039;adTypeBinary
        .Open
        .LoadFromFile filename
        bArr = .Read
        .Close
        ReadBinaryFile = bArr
    End With
End Function

Function SaveBinaryData(filename, byteArray)
    Const adSaveCreateOverWrite = 2
    With CreateObject(&quot;ADODB.Stream&quot;)
        .Type = 1 &#039;adTypeBinary
        .Open
        .Write byteArray
        .SaveToFile filename, adSaveCreateOverWrite
        .Close
    End With
End Function

&#039;============================================================
&#039; Проверка
file = &quot;input.jpg&quot;
file_out = &quot;output.jpg&quot;

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

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

&#039;Можете сравнить входной и результирующий файл - они равны!</code></pre></div><p>Автор примера — <strong>mozers</strong>.<br />Внимание! Данный код может быть опознан антивирусной программой как вирус, однако на самом деле это, конечно, не соответствует действительности.</p>]]></content>
			<author>
				<name><![CDATA[The gray Cardinal]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=2</uri>
			</author>
			<updated>2009-11-03T16:36:49Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=30067#p30067</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: WSH: чтение и запись бинарных данных]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=9553#p9553" />
			<content type="html"><![CDATA[<p>Предыдущий пример в виде функции.<br />Добавлена небольшая &quot;компрессия&quot; - для типового .exe текстовый файл получается процентов на 30 компактнее (проверялось на explorer.exe).<br /></p><div class="codebox"><pre><code>&lt;job&gt;
 &lt;script language=&quot;JScript&quot;&gt;

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

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

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


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

 &lt;/script&gt;
&lt;/job&gt;</code></pre></div><p>Автор примера - <strong>fps</strong>.</p>]]></content>
			<author>
				<name><![CDATA[The gray Cardinal]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=2</uri>
			</author>
			<updated>2008-03-04T14:14:37Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=9553#p9553</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[WSH: чтение и запись бинарных данных]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=9552#p9552" />
			<content type="html"><![CDATA[<p>Пример демонстрирует возможность сохранить бинарные данные в текстовом виде, так, чтобы этот текст не содержал непечатаемых символов. Пример считывает бинарный файл &quot;infile&quot; в строку и пишет её в текстовый файл. Затем считывает текстовый файл и создает бинарный файл &quot;outfile&quot;.<br /></p><div class="codebox"><pre><code>&lt;job&gt;
 &lt;script language=&quot;JScript&quot;&gt;

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

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

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


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

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

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

 &lt;/script&gt;
&lt;/job&gt;</code></pre></div><p>Автор примера - <strong>fps</strong>.</p>]]></content>
			<author>
				<name><![CDATA[The gray Cardinal]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=2</uri>
			</author>
			<updated>2008-03-04T14:11:13Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=9552#p9552</id>
		</entry>
</feed>
