<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; VBScript: чтение и запись бинарных данных]]></title>
	<link rel="self" href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=2852&amp;type=atom" />
	<updated>2009-03-12T15:35:50Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=2852</id>
		<entry>
			<title type="html"><![CDATA[Re: VBScript: чтение и запись бинарных данных]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=20602#p20602" />
			<content type="html"><![CDATA[<p>Бесплатный COM-сервер <a href="http://www.xstandard.com/en/documentation/xbuffer/">Buffer Component</a> предназначен для чтения и записи бинарных файлов, вычисления контрольных сумм MD5 и преобразований Base64. Скачать компонент можно <a href="http://www.xstandard.com/en/downloads/?product=buffer">здесь</a> (ссылка для скачивания высылается на e-mail). Дистрибутив (архив) имеет размер чуть более 35 Кб.</p><p>Пример копирует файл &quot;C:\Temp\test.jpg&quot;, добавляя текст в конец файла:<br /></p><div class="codebox"><pre><code>Set oBuffer = CreateObject(&quot;XStandard.Buffer&quot;)
oBuffer.Load &quot;C:\Temp\test.jpg&quot;
WScript.Echo oBuffer.Length &#039; размер файла в байтах
oBuffer.Write &quot;Mary had a little lamb&quot;
oBuffer.SaveAs &quot;C:\Temp\test1.jpg&quot;</code></pre></div><p>Склейка бинарных файлов:<br /></p><div class="codebox"><pre><code>Set oBuffer = CreateObject(&quot;XStandard.Buffer&quot;)
oBuffer.Load &quot;C:\Temp\second.jpg&quot;
store = oBuffer.SafeArray &#039; сохраняем файл в памяти
oBuffer.Reset() &#039; очищаем объект
oBuffer.Load &quot;C:\Temp\test.jpg&quot;
oBuffer.Write &quot;-=BEGIN=-&quot; &#039; дописываем файл
oBuffer.Write store &#039; дописываем файл
oBuffer.SaveAs &quot;C:\Temp\test1.jpg&quot;</code></pre></div>]]></content>
			<author>
				<name><![CDATA[The gray Cardinal]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=2</uri>
			</author>
			<updated>2009-03-12T15:35:50Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=20602#p20602</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBScript: чтение и запись бинарных данных]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=20418#p20418" />
			<content type="html"><![CDATA[<p>Компонент <strong>ChilkatUtil.dll</strong>, который содержит несколько полезных COM-серверов (в т.ч. <strong>CkData</strong>), устанавливается вместе с <a href="http://forum.script-coding.com/viewtopic.php?id=2878">Chilkat Spider</a>. Документацию по объекту <strong>CkData</strong> можно найти <a href="http://www.chilkatsoft.com/refdoc/xCkDataRef.html">здесь</a>.</p><p>Демонстрация некоторых свойств и методов, пример копирует файл &quot;C:\Temp\test.jpg&quot;, добавляя текст в конец файла:<br /></p><div class="codebox"><pre><code>Set oData = CreateObject(&quot;Chilkat.CkData&quot;)
&#039;WScript.Echo oData.Version &#039; версия объекта
oData.LoadFile &quot;C:\Temp\test.jpg&quot; &#039; открытие и загрузка двоичного файла
WScript.Echo oData.Filename &amp; &quot;, &quot; &amp; oData.NumBytes &#039; имя файла и размер данных в байтах
oData.AppendString &quot;Text to end of file&quot; &#039; добавление строки в конец данных
oData.SaveToFile &quot;C:\Temp\test2.jpg&quot; &#039; сохранение данных в двоичный файл
WScript.Echo oData.Filename &amp; &quot;, &quot; &amp; oData.NumBytes
&#039;WScript.Echo oData.LastErrorText &#039; текстовое описание последней ошибки

&#039; дополнительные свойства, только для удобства:
oData.ContentType = &quot;jpg&quot;
WScript.Echo oData.ContentType
oData.Description = &quot;descr&quot;
WScript.Echo oData.Description</code></pre></div><p>Пример, сохраняющий файл как временный, с демонстрацией получения и загрузки данных в виде массива байтов:<br /></p><div class="codebox"><pre><code>Set oData = CreateObject(&quot;Chilkat.CkData&quot;)
oData.LoadFile &quot;C:\Temp\test.jpg&quot; &#039; открытие и загрузка двоичного файла
arr = oData.GetBinary() &#039; массив байтов, Byte()
WScript.Echo UBound(arr) + 1 &#039; размер файла
oData.LoadBinary arr
WScript.Echo oData.SaveToTempFile(&quot;prefix_&quot;) &#039; сохранение данных во временный tmp-файл и вывод его пути</code></pre></div><p>Объект имеет целый ряд методов для получения загруженных данных и их срезов в виде строк и чисел различного формата, см. документацию.</p>]]></content>
			<author>
				<name><![CDATA[The gray Cardinal]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=2</uri>
			</author>
			<updated>2009-03-09T21:10:42Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=20418#p20418</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBScript: чтение и запись бинарных данных]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=20032#p20032" />
			<content type="html"><![CDATA[<p>Объект <strong>JSBin.BinaryOps</strong> имеет методы для конвертации строкового представления байта в число и обратно:<br /></p><div class="codebox"><pre><code>Set oBin = CreateObject(&quot;JSBin.BinaryOps&quot;)
WScript.Echo oBin.Bits8ToDecimal(&quot;00011100&quot;) &#039; 28
WScript.Echo oBin.DecimalToBits8(28) &#039; 00011100</code></pre></div><p>Подмена сведений о глубине цвета в BMP файле (запись бинарных данных), пример использования методов объекта JSBin.BinaryOps для конвертации чисел в ByteArray. См. также <a href="http://forum.script-coding.com/viewtopic.php?id=239">WSH: патч бинарного файла</a>.<br /></p><div class="codebox"><pre><code>Set oBin = CreateObject(&quot;JSBin.BinaryOps&quot;)
path = &quot;C:\Temp\test.bmp&quot;
ArrayOfByteNumbers = oBin.Get2BytesFromNum(16) &#039; глубина цвета 16
e = oBin.BinaryOpen(&quot;C:\Temp\test.bmp&quot;, L)
e = oBin.BinaryWrite(ArrayOfByteNumbers, 28) &#039; байты 28 - 29
e = oBin.BinaryClose()</code></pre></div>]]></content>
			<author>
				<name><![CDATA[The gray Cardinal]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=2</uri>
			</author>
			<updated>2009-02-26T14:05:53Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=20032#p20032</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[VBScript: чтение и запись бинарных данных]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=20026#p20026" />
			<content type="html"><![CDATA[<p>См. также <a href="http://forum.script-coding.com/viewtopic.php?id=1226">JScript: чтение и запись бинарных данных</a>.</p><p>Бесплатный COM-сервер <a href="http://www.jsware.net/jsware/scripts.php5#jsbin">JSBin.dll</a> предназначен для работы с двоичными данными (файлами) и их конвертации в/из строки Base64. Компонент написан в Visual Basic 6 и требует наличия библиотеки MSVBVM60.DLL. Дистрибутив компонента (архив с примерами и документацией) имеет размер чуть более 35 Кб.</p><p>Запись данных в конец бинарного файла:<br /></p><div class="codebox"><pre><code>Set oJSBin = CreateObject(&quot;JSBin.BinaryOps&quot;)
errCode = oJSBin.BinaryOpen(&quot;C:\Temp\test.jpg&quot;, L)
&#039; L - размер файла в байтах
errCode = oJSBin.BinaryWrite(String2ByteArray(&quot;Alex for Justas...&quot;), L+1)
errCode = oJSBin.BinaryClose()

Function String2ByteArray(sQuery)
    iQueryLen = Len(sQuery)
    Dim byQuery()
    For i = 1 To iQueryLen
        ReDim Preserve byQuery(i-1)
        byQuery(i-1) = CByte(Asc(Mid(sQuery, i, 1)))
    Next
    String2ByteArray = byQuery
End Function</code></pre></div><p>Чтение данных из бинарного файла:<br /></p><div class="codebox"><pre><code>Set oJSBin = CreateObject(&quot;JSBin.BinaryOps&quot;)
StartPoint = 6 &#039; начиная с 7-го байта
LengthToRead = 4 &#039; прочитать 4 байта
errCode = oJSBin.BinaryRead(&quot;C:\Temp\test.jpg&quot;, StartPoint, LengthToRead, Arr)
res = &quot;&quot;
For i = 0 To LengthToRead - 1
    res = res &amp; Chr(Arr(i))
Next
WScript.Echo res &#039; JFIF (JPEG File Interchange Format)</code></pre></div><p>Чтение данных из бинарного файла, конвертация байтов в числа (получение информации об изображении BMP):<br /></p><div class="codebox"><pre><code>&#039; BITMAPFILEHEADER
&#039; file type, байты 0 - 1, &quot;BM&quot;
&#039; file size, байты 2 - 5

&#039; BITMAPINFOHEADER
&#039; width, байты 18 - 21
&#039; height, байты 22 - 25
&#039; BitsPerPixel, байты 28 - 29 

Set bin = CreateObject(&quot;JSBin.BinaryOps&quot;)
path = &quot;C:\Temp\test.bmp&quot;
L = 30 &#039; читаем 30 байтов
e = bin.BinaryRead(path, 0, L, A)
If e &lt;&gt; 0 then
    WScript.Echo &quot;не удалось прочитать файл&quot;
    WScript.Quit
End If
e = Chr(A(0)) &amp; Chr(A(1))
s = &quot;Тип файла: &quot; &amp; e &amp; VbCrLf
e = bin.GetNumFrom4Bytes(A(2), A(3), A(4), A(5))
s = s &amp; &quot;Размер файла: &quot; &amp; e &amp; &quot; байтов&quot; &amp; VbCrLf
e = bin.GetNumFrom4Bytes(A(18), A(19), A(20), A(21))
s = s &amp; &quot;Ширина: &quot; &amp; e &amp; &quot; точек (пикселей)&quot; &amp; VbCrLf
e = bin.GetNumFrom4Bytes(A(22), A(23), A(24), A(25))
s = s &amp; &quot;Высота: &quot; &amp; e &amp; &quot; точек (пикселей)&quot; &amp; VbCrLf
e = bin.GetNumFrom2Bytes(A(28), A(29))
s = s &amp; &quot;Глубина цвета (битов на пиксель): &quot; &amp; e
WScript.Echo s</code></pre></div>]]></content>
			<author>
				<name><![CDATA[The gray Cardinal]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=2</uri>
			</author>
			<updated>2009-02-26T13:09:21Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=20026#p20026</id>
		</entry>
</feed>
