至少有三种以上办法,可以把二进制数据(比如您从ASP的Request.BinaryRead方法得到的数据)转换为字符串。
第一种:使用VBS的MultiByte方法
实例:
FunctionSimpleBinaryToString(Binary)
'SimpleBinaryToStringconvertsbinarydata(VT_UI1|VT_ARRAYOrMultiBytestring)
'toastring(BSTR)usingMultiByteVBSfunctions
DimI,S
ForI=1ToLenB(Binary)
S=S&Chr(AscB(MidB(Binary,I,1)))
Next
SimpleBinaryToString=S
EndFunction
这个方法非常简单明了,但是处理大数据流时,比较慢。
建议只用来处理100KB以下的数据。
下面的这个类似的方法,性能稍微好些:
FunctionBinaryToString(Binary)
'AntoninFoller,http://www.pstruh.cz
'OptimizedversionofasimpleBinaryToStringalgorithm.
Dimcl1,cl2,cl3,pl1,pl2,pl3
DimL
cl1=1
cl2=1
cl3=1
L=LenB(Binary)
DoWhilecl1<=L
pl3=pl3&Chr(AscB(MidB(Binary,cl1,1)))
cl1=cl1+1
cl3=cl3+1
Ifcl3>300Then
pl2=pl2&pl3
pl3=""
cl3=1
cl2=cl2+1
Ifcl2>200Then
pl1=pl1&pl2
pl2=""
cl2=1
EndIf
EndIf
Loop
BinaryToString=pl1&pl2&pl3
EndFunction
BinaryToString方法比SimpleBinaryToString方法性能高20倍。建议用来处理2MB以下的数据。
第二种方法:使用ADODB.Recordset
ADODB.Recordset可以让你支持几乎所有VARIANT支持的数据类型,你可以用它在string和
binary之间转换。
FunctionRSBinaryToString(xBinary)
'AntoninFoller,http://www.pstruh.cz
'RSBinaryToStringconvertsbinarydata(VT_UI1|VT_ARRAYOrMultiBytestring)
'toastring(BSTR)usingADOrecordset
DimBinary
'MultiBytedatamustbeconvertedToVT_UI1|VT_ARRAYfirst.
Ifvartype(xBinary)=8ThenBinary=MultiByteToBinary(xBinary)ElseBinary=xBinary
DimRS,LBinary
ConstadLongVarChar=201
SetRS=CreateObject("ADODB.Recordset")
LBinary=LenB(Binary)
IfLBinary>0Then
RS.Fields.Append"mBinary",adLongVarChar,LBinary
RS.Open
RS.AddNew
RS("mBinary").AppendChunkBinary
RS.Update
RSBinaryToString=RS("mBinary")
Else
RSBinaryToString=""
EndIf
EndFunction
RSBinaryToString没有什么限制--除了物理内存之外。这种处理方式是MultiByte方式的100倍!你可以用它来处理高达100MB的数据!这种转换方式,你也可以用来把MultiBytestrings转换为String。下面这个方法把MultiBytestrings转换为Binary:FunctionMultiByteToBinary(MultiByte)
'©2000AntoninFoller,http://www.pstruh.cz
'MultiByteToBinaryconvertsmultibytestringTorealbinarydata(VT_UI1|VT_ARRAY)
'Usingrecordset
DimRS,LMultiByte,Binary
ConstadLongVarBinary=205
SetRS=CreateObject("ADODB.Recordset")
LMultiByte=LenB(MultiByte)
IfLMultiByte>0Then
RS.Fields.Append"mBinary",adLongVarBinary,LMultiByte
RS.Open
RS.AddNew
RS("mBinary").AppendChunkMultiByte&ChrB(0)
RS.Update
Binary=RS("mBinary").GetChunk(LMultiByte)
EndIf
MultiByteToBinary=Binary
EndFunction
第三种:使用ADODB.Stream这种方式是比较常用的:'Stream_BinaryToStringFunction
'2003AntoninFoller,http://www.pstruh.cz
'Binary-VT_UI1|VT_ARRAYdataToconvertToastring
'CharSet-charsetofthesourcebinarydata-defaultis"us-ascii"
FunctionStream_BinaryToString(Binary,CharSet)
ConstadTypeText=2
ConstadTypeBinary=1
'CreateStreamobject
DimBinaryStream'AsNewStream
SetBinaryStream=CreateObject("ADODB.Stream")
'Specifystreamtype-wewantTosavetext/stringdata.
BinaryStream.Type=adTypeBinary
'OpenthestreamAndwritetext/stringdataTotheobject
BinaryStream.Open
BinaryStream.WriteBinary
'ChangestreamtypeTobinary
BinaryStream.Position=0
BinaryStream.Type=adTypeText
'SpecifycharsetForthesourcetext(unicode)data.
IfLen(CharSet)>0Then
BinaryStream.CharSet=CharSet
Else
BinaryStream.CharSet="us-ascii"
EndIf
'OpenthestreamAndgetbinarydatafromtheobject
Stream_BinaryToString=BinaryStream.ReadText
EndFunction
要存储、获取二进制数据,从一个本地文件、上传的二进制数据文件或者ASP中,可以参考:PureandHugeASPfileuploadwithprogress.。Tipkeywords:Binary,Byte,Array,VT_UI1,VT_ARRAY,BinaryWrite,BinaryRead,ChrB,InstrB,LeftB,MidB,RightB,ASP,VBSCOPYRIGHTANDPERMITTEDUSEOFhttp://www.pstruh.cz/tipsWEBSITE.TheentirecontentsofPSTRUHSoftwarewebsiteconsistofcopyrightmaterialownedbyAntoninFoller,PSTRUHSoftware.