Javascript VBScript慢字节数组复制

Javascript VBScript慢字节数组复制,javascript,vbscript,binary-data,Javascript,Vbscript,Binary Data,我使用以下代码读取VBScript中的二进制文件,并将其存储在字节数组中,然后从Javascript访问该字节数组并将其复制到JS数组,基本上这只是我在JS中发现的读取二进制数据的一种偷偷摸摸的方法(唯一的方法!) Function readBinaryFile(fileName) dim inStream,buff set inStream=CreateObject("ADODB.Stream") inStream.Open inStream.type=1

我使用以下代码读取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分钟以上。我希望能阅读大约2毫克的文件

有人能解释一下为什么这是一个如此缓慢的操作,如果我能做些什么来加快它吗


谢谢。

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

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

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

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)

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

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)

仍然没有找到解决方案,但这是一个次要问题,现在可以正常工作(如果在某些情况下非常缓慢)因此,很遗憾,没有时间进一步研究它。

仍然没有找到解决方案,但这是一个次要问题,现在它确实可以正常工作(如果在某些情况下非常缓慢),因此,很遗憾,没有时间进一步研究它。

不,很遗憾,我在这里没有选择,这是一个纯粹基于web的应用程序,我没有能力使用任何其他插件或编译的组件。对于Firefox用户,我们有一个插件可以毫无问题地执行此操作,问题是IE用户。您是否研究过在页面上嵌入.NET组件的可能性?我知道.NET有一种机制,可以将组件嵌入到运行类似Java(我猜)的沙盒的页面上,但我很少使用它们。当然,我认为Java本身也会更好,而且可能更易于移植。你甚至不能使用这些组件吗?我不确定这是否是你的意思,但我们已经在使用嵌入在页面中的XBAP,这些都是基于web的.NET WPF应用程序,功能非常强大,但对于我们在这里尝试执行的操作来说,还不够轻量级。我想我要说的更多的是直接在web页面中脚本可以与之对话的内容。网络控件。。。请看这个例子:不,很遗憾,我在这里没有选择,这是一个纯基于web的应用程序,我没有能力使用任何其他插件或编译的组件。对于Firefox用户,我们有一个插件可以毫无问题地执行此操作,问题是IE用户。您是否研究过在页面上嵌入.NET组件的可能性?我知道.NET有一种机制,可以将组件嵌入到运行类似Java(我猜)的沙盒的页面上,但我很少使用它们。当然,我认为Java本身也会更好,而且可能更易于移植。你甚至不能使用这些组件吗?我不确定这是否是你的意思,但我们已经在使用嵌入在页面中的XBAP,这些都是基于web的.NET WPF应用程序,功能非常强大,但对于我们在这里尝试执行的操作来说,还不够轻量级。我想我要说的更多的是直接在web页面中脚本可以与之对话的内容。网络控件。。。看这个例子:我认为你是对的,问题是必须循环遍历每个字节,这就是我想要避免的,上面的听起来值得一试,但我不确定它是否能满足我的需要。我需要访问原始字节,以便一次只移动一个字节,重新创建4字节整数和各种其他类型。我不确定我能用ASCII字符串做我所需要的。@Adam:试着读取返回字符串的ASCII值,它们可能就是你所需要的。我想你是对的,问题肯定是必须循环遍历每个字节,这就是我想要避免的,上面的听起来值得一试,但我不确定它是否能满足我的需要。我需要访问原始字节,以便一次只移动一个字节,重新创建4字节整数和各种其他类型。我不确定我能用ASCII字符串做我需要的。@Adam:试着读取返回字符串的ASCII值,它们可能就是你需要的。