如何用VBScript将二进制数据写入磁盘?

如何用VBScript将二进制数据写入磁盘?,vbscript,asp-classic,binary,Vbscript,Asp Classic,Binary,我有一个需要写入文件的二进制字符串。我有一种感觉,这应该是一个简单的过程,但话说回来,VBScript。FileSystemObject没有任何帮助,因为它会清除数据。Stream对象看起来很有前途,它的adBinaryMode及其Write方法,但是Write方法需要字节数组,并且似乎不接受变体数组。由于VBScript数组都是变量数组,因此这似乎有问题 那么,如何将数据写入文件 编辑:我应该补充的是,整个事情必须是VBScript。没有额外的组件。对不起,我也不喜欢。有几种选择。这里描述的最

我有一个需要写入文件的二进制字符串。我有一种感觉,这应该是一个简单的过程,但话说回来,VBScript。
FileSystemObject
没有任何帮助,因为它会清除数据。
Stream
对象看起来很有前途,它的
adBinaryMode
及其
Write
方法,但是
Write
方法需要字节数组,并且似乎不接受变体数组。由于VBScript数组都是变量数组,因此这似乎有问题

那么,如何将数据写入文件


编辑:我应该补充的是,整个事情必须是VBScript。没有额外的组件。对不起,我也不喜欢。有几种选择。这里描述的最有趣的变体是在自定义函数的帮助下将二进制数据转换为字符串。

普通的
文件系统对象也可以这样做
,下面是我在自定义上载脚本中使用的代码,这是我很久以前编写的,使用我在网上找到的代码将二进制字符串转换为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

在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
要使用
FileSystemObject
将(十六进制编码的)二进制字符串写入文件,请执行以下操作:

Dim File : Set File = CreateObject("Scripting.FileSystemObject").CreateTextFile("Binary.gif")

data = "47 49 46 38 37 61 07 00 07 00 80 F0 00 FF 00 00 00 FF FF 2C 00 00 00 00 07 00 07 00 40 02 02 44 01 00 3B"
data = Split (data)

for each x in data
File.write chr("&H" & x)
next

File.Close

在整个ASP文件上传问题上,我的头撞到了墙上,这终于可以正常工作了:-)。我真不敢相信,这么多的第三方玩弄弄弄弄弄弄弄弄弄弄得如此重要的东西竟然需要:-/。非常感谢你@mfeineis lol,很高兴这个oooold代码有这么大的帮助!:)太棒了,现在我还得和这个古老的东西斗争,这似乎是在无休止的摆弄/测试/搜索之后唯一有效的解决方案。问题是在VBS中编写一个二进制文件而不需要外部下载。@Zimba true,我的答案是纯VBScript。没有外部下载。复制和粘贴,它的工作。干杯。问题是向磁盘写入二进制数据(创建文件)