1

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

См. также JScript: чтение и запись бинарных данных.

Бесплатный COM-сервер JSBin.dll предназначен для работы с двоичными данными (файлами) и их конвертации в/из строки Base64. Компонент написан в Visual Basic 6 и требует наличия библиотеки MSVBVM60.DLL. Дистрибутив компонента (архив с примерами и документацией) имеет размер чуть более 35 Кб.

Запись данных в конец бинарного файла:

Set oJSBin = CreateObject("JSBin.BinaryOps")
errCode = oJSBin.BinaryOpen("C:\Temp\test.jpg", L)
' L - размер файла в байтах
errCode = oJSBin.BinaryWrite(String2ByteArray("Alex for Justas..."), 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

Чтение данных из бинарного файла:

Set oJSBin = CreateObject("JSBin.BinaryOps")
StartPoint = 6 ' начиная с 7-го байта
LengthToRead = 4 ' прочитать 4 байта
errCode = oJSBin.BinaryRead("C:\Temp\test.jpg", StartPoint, LengthToRead, Arr)
res = ""
For i = 0 To LengthToRead - 1
    res = res & Chr(Arr(i))
Next
WScript.Echo res ' JFIF (JPEG File Interchange Format)

Чтение данных из бинарного файла, конвертация байтов в числа (получение информации об изображении BMP):

' BITMAPFILEHEADER
' file type, байты 0 - 1, "BM"
' file size, байты 2 - 5

' BITMAPINFOHEADER
' width, байты 18 - 21
' height, байты 22 - 25
' BitsPerPixel, байты 28 - 29 

Set bin = CreateObject("JSBin.BinaryOps")
path = "C:\Temp\test.bmp"
L = 30 ' читаем 30 байтов
e = bin.BinaryRead(path, 0, L, A)
If e <> 0 then
    WScript.Echo "не удалось прочитать файл"
    WScript.Quit
End If
e = Chr(A(0)) & Chr(A(1))
s = "Тип файла: " & e & VbCrLf
e = bin.GetNumFrom4Bytes(A(2), A(3), A(4), A(5))
s = s & "Размер файла: " & e & " байтов" & VbCrLf
e = bin.GetNumFrom4Bytes(A(18), A(19), A(20), A(21))
s = s & "Ширина: " & e & " точек (пикселей)" & VbCrLf
e = bin.GetNumFrom4Bytes(A(22), A(23), A(24), A(25))
s = s & "Высота: " & e & " точек (пикселей)" & VbCrLf
e = bin.GetNumFrom2Bytes(A(28), A(29))
s = s & "Глубина цвета (битов на пиксель): " & e
WScript.Echo s
Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

2

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

Объект JSBin.BinaryOps имеет методы для конвертации строкового представления байта в число и обратно:

Set oBin = CreateObject("JSBin.BinaryOps")
WScript.Echo oBin.Bits8ToDecimal("00011100") ' 28
WScript.Echo oBin.DecimalToBits8(28) ' 00011100

Подмена сведений о глубине цвета в BMP файле (запись бинарных данных), пример использования методов объекта JSBin.BinaryOps для конвертации чисел в ByteArray. См. также WSH: патч бинарного файла.

Set oBin = CreateObject("JSBin.BinaryOps")
path = "C:\Temp\test.bmp"
ArrayOfByteNumbers = oBin.Get2BytesFromNum(16) ' глубина цвета 16
e = oBin.BinaryOpen("C:\Temp\test.bmp", L)
e = oBin.BinaryWrite(ArrayOfByteNumbers, 28) ' байты 28 - 29
e = oBin.BinaryClose()
Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

3

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

Компонент ChilkatUtil.dll, который содержит несколько полезных COM-серверов (в т.ч. CkData), устанавливается вместе с Chilkat Spider. Документацию по объекту CkData можно найти здесь.

Демонстрация некоторых свойств и методов, пример копирует файл "C:\Temp\test.jpg", добавляя текст в конец файла:

Set oData = CreateObject("Chilkat.CkData")
'WScript.Echo oData.Version ' версия объекта
oData.LoadFile "C:\Temp\test.jpg" ' открытие и загрузка двоичного файла
WScript.Echo oData.Filename & ", " & oData.NumBytes ' имя файла и размер данных в байтах
oData.AppendString "Text to end of file" ' добавление строки в конец данных
oData.SaveToFile "C:\Temp\test2.jpg" ' сохранение данных в двоичный файл
WScript.Echo oData.Filename & ", " & oData.NumBytes
'WScript.Echo oData.LastErrorText ' текстовое описание последней ошибки

' дополнительные свойства, только для удобства:
oData.ContentType = "jpg"
WScript.Echo oData.ContentType
oData.Description = "descr"
WScript.Echo oData.Description

Пример, сохраняющий файл как временный, с демонстрацией получения и загрузки данных в виде массива байтов:

Set oData = CreateObject("Chilkat.CkData")
oData.LoadFile "C:\Temp\test.jpg" ' открытие и загрузка двоичного файла
arr = oData.GetBinary() ' массив байтов, Byte()
WScript.Echo UBound(arr) + 1 ' размер файла
oData.LoadBinary arr
WScript.Echo oData.SaveToTempFile("prefix_") ' сохранение данных во временный tmp-файл и вывод его пути

Объект имеет целый ряд методов для получения загруженных данных и их срезов в виде строк и чисел различного формата, см. документацию.

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

4

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

Бесплатный COM-сервер Buffer Component предназначен для чтения и записи бинарных файлов, вычисления контрольных сумм MD5 и преобразований Base64. Скачать компонент можно здесь (ссылка для скачивания высылается на e-mail). Дистрибутив (архив) имеет размер чуть более 35 Кб.

Пример копирует файл "C:\Temp\test.jpg", добавляя текст в конец файла:

Set oBuffer = CreateObject("XStandard.Buffer")
oBuffer.Load "C:\Temp\test.jpg"
WScript.Echo oBuffer.Length ' размер файла в байтах
oBuffer.Write "Mary had a little lamb"
oBuffer.SaveAs "C:\Temp\test1.jpg"

Склейка бинарных файлов:

Set oBuffer = CreateObject("XStandard.Buffer")
oBuffer.Load "C:\Temp\second.jpg"
store = oBuffer.SafeArray ' сохраняем файл в памяти
oBuffer.Reset() ' очищаем объект
oBuffer.Load "C:\Temp\test.jpg"
oBuffer.Write "-=BEGIN=-" ' дописываем файл
oBuffer.Write store ' дописываем файл
oBuffer.SaveAs "C:\Temp\test1.jpg"
Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.