Как я могу записать двоичные данные на диск в VBScript? - PullRequest
4 голосов
/ 07 апреля 2011

У меня есть двоичная строка, которую мне нужно записать в файл. У меня такое чувство, что должно быть простой процедурой, но опять же, VBScript. FileSystemObject не поможет, так как он собирает данные. Объект Stream выглядит многообещающе, с его adBinaryMode и его методом Write, но метод Write требует байтового массива и, похоже, вместо этого не принимает вариантный массив. Поскольку массивы VBScript представляют собой все вариантные массивы, это кажется проблематичным.

Итак, как мне просто записать данные в файл?

РЕДАКТИРОВАТЬ: я должен добавить, что все это должно быть VBScript. Никаких дополнительных компонентов. Извините, мне это тоже не нравится.

Ответы [ 3 ]

5 голосов
/ 10 апреля 2011

Это также возможно с обычным FileSystemObject, вот код, который я использую в пользовательском скрипте загрузки, который я написал давно, используя код, который я нашел в Интернете, который преобразует двоичную строку в ASCII:

Set objFSO = Server.CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.CreateTextFile("file path here")
objFile.Write(RSBinaryToString(strBinaryContents))
objFile.Close
Set objFile=Nothing
Set objFSO=Nothing

Private Function RSBinaryToString(xBinary)
    'Antonin Foller, http://www.motobit.com
    'RSBinaryToString converts binary data (VT_UI1 | VT_ARRAY Or MultiByte string)
    'to a string (BSTR) using ADO recordset

    Dim Binary
    'MultiByte data must be converted To VT_UI1 | VT_ARRAY first.
    If vartype(xBinary)=8 Then Binary = MultiByteToBinary(xBinary) Else Binary = xBinary

    Dim RS, LBinary
    Const adLongVarChar = 201
    Set RS = CreateObject("ADODB.Recordset")
    LBinary = LenB(Binary)

    If LBinary>0 Then
        RS.Fields.Append "mBinary", adLongVarChar, LBinary
        RS.Open
        RS.AddNew
        RS("mBinary").AppendChunk Binary 
        RS.Update
        RSBinaryToString = RS("mBinary")
    Else  
        RSBinaryToString = ""
    End If
End Function

Function MultiByteToBinary(MultiByte)
    '© 2000 Antonin Foller, http://www.motobit.com
    ' MultiByteToBinary converts multibyte string To real binary data (VT_UI1 | VT_ARRAY)
    ' Using recordset
    Dim RS, LMultiByte, Binary
    Const adLongVarBinary = 205
    Set RS = CreateObject("ADODB.Recordset")
    LMultiByte = LenB(MultiByte)
    If LMultiByte>0 Then
        RS.Fields.Append "mBinary", adLongVarBinary, LMultiByte
        RS.Open
        RS.AddNew
        RS("mBinary").AppendChunk MultiByte & ChrB(0)
        RS.Update
        Binary = RS("mBinary").GetChunk(LMultiByte)
    End If
    MultiByteToBinary = Binary
End Function
2 голосов
/ 07 апреля 2011

Здесь несколько вариантов.Описанный там наиболее интересный вариант преобразует двоичные данные в строку с помощью пользовательской функции BinaryToString .

1 голос
/ 27 февраля 2017

Запись в двоичный файл в VBScript проста, но требует записи по одному байту за раз. В качестве демонстрации приведен простой скрипт, который создает однопиксельный GIF-файл. Полученный файл содержит именно двоичное содержимое, записанное в нем, и ничего более, и является действительным файлом GIF.

Dim GifFile : Set GifFile = CreateObject("Scripting.FileSystemObject").CreateTextFile("SinglePixel.gif")

With GifFile
    .write chr(&h47) 'GIF87a
    .write chr(&h49)
    .write chr(&h46)
    .write chr(&h38)
    .write chr(&h37)
    .write chr(&h61)
    .write chr(&h01) 'Width
    .write chr(&h00)
    .write chr(&h01) 'Height
    .write chr(&h00)
    .write chr(&h80) 'Use global color map
    .write chr(&h00) 'Background
    .write chr(&h00) 'End of header
    .write chr(&h00) 'Color map color #1 in RGB
    .write chr(&h00)
    .write chr(&h00)
    .write chr(&hFF) 'Color map color #2 in RGB
    .write chr(&hFF)
    .write chr(&hFF)
    .write chr(&h2C) 'Image descriptor
    .write chr(&h00) 'Left
    .write chr(&h00)
    .write chr(&h00) 'Top
    .write chr(&h00)
    .write chr(&h01) 'Width
    .write chr(&h00)
    .write chr(&h01) 'Height
    .write chr(&h00)
    .write chr(&h40) 'Use global color map / seq order / 1 bit per pixel
    .write chr(&h02) 'Code size
    .write chr(&h02) 'Blok byte count
    .write chr(&h44) 'LZW data
    .write chr(&h01)
    .write chr(&h00) 'Terminate data stream
    .write chr(&h3B) 'Gif terminator
End With

GifFile.Close
...