VBScript慢字节数组副本

时间:2010-12-20 13:46:30

标签: javascript vbscript binary-data

我使用以下代码读取VBScript中的二进制文件并将其存储在一个字节数组中,然后我从Javascript访问并复制到JS数组,基本上只是一种偷偷摸摸的方式(唯一的方法!)我我发现在我的JS中读取二进制数据。

Function readBinaryFile(fileName)
    dim inStream,buff

    set inStream=CreateObject("ADODB.Stream")
    inStream.Open
    inStream.type=1

    inStream.LoadFromFile fileName

    buff=inStream.Read()
    inStream.Close

    Dim byteArray()

    Dim i
    Dim len
    len = LenB(buff)

    ReDim byteArray(len)

    For i = 1 To len
        byteArray(i-1) = AscB(MidB(buff, i, 1))
    Next

    readBinaryFile=byteArray
End Function

它似乎完全按预期工作,唯一的问题是它看起来非常慢。例如,读取300kb文件可能需要2分钟。我期待阅读大约2meg的文件。

有人可以解释为什么这是一个如此缓慢的操作,如果我有什么办法可以加快它的速度?

感谢。

3 个答案:

答案 0 :(得分:3)

问题是循环。尝试使用断开连接的记录集进行转换:

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

在您的情况下,readBinaryFile返回文件的“ASCII内容”并使用它代替数组:readBinaryFile = RSBinaryToString(buf)

答案 1 :(得分:2)

我认为这是因为您使用高级脚本语言来模拟应该由低级编译语言完成的事情。我想脚本不支持二进制数据是有原因的。它们不是设计为一次处理一个字节的数据。循环使用300,000字节的数据会在许多语言中花费大量时间,但是非编译(脚本)语言会使情况变得更糟。我可以建议的唯一的事情是使用编译语言,或者使用一些编译语言创建的ActiveX对象,这些语言支持您想要执行的操作,而不必在脚本中逐字节地执行它们。您是否可以选择使用已编译的组件或其他语言?

答案 2 :(得分:0)

仍然没有找到解决方案,但它现在是一个副作用,并且确实有效(如果在某些情况下非常缓慢),所以没有时间再看看它。