我使用以下代码读取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的文件。
有人可以解释为什么这是一个如此缓慢的操作,如果我有什么办法可以加快它的速度?
感谢。
答案 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)
仍然没有找到解决方案,但它现在是一个副作用,并且确实有效(如果在某些情况下非常缓慢),所以没有时间再看看它。