vbs 二進制數據流轉換字符串的方法

至少有三種以上辦法,可以把二進制數據(比如您從asp的request.binaryread方法得到的數據)轉換爲字符串。

第一種:使用vbs的multibyte 方法

實例:

function simplebinarytostring(binary)
simplebinarytostring converts binary data (vt_ui1 | vt_array or multibyte string)
to a string (bstr) using multibyte vbs functions
dim i, s
for i = 1 to lenb(binary)
s = s & chr(ascb(midb(binary, i, 1)))
next
simplebinarytostring = s
end function

這個方法非常簡單明瞭,但是處理大數據流時,比較慢。
建議只用來處理100kb以下的數據。
下面的這個類似的方法,性能稍微好些:
function binarytostring(binary)
antonin foller, http://www.pstruh.cz
optimized version of a simple binarytostring algorithm.

dim cl1, cl2, cl3, pl1, pl2, pl3
dim l
cl1 = 1
cl2 = 1
cl3 = 1
l = lenb(binary)

do while cl1<=l
pl3 = pl3 & chr(ascb(midb(binary,cl1,1)))
cl1 = cl1 + 1
cl3 = cl3 + 1
if cl3>300 then
pl2 = pl2 & pl3
pl3 = ""
cl3 = 1
cl2 = cl2 + 1
if cl2>200 then
pl1 = pl1 & pl2
pl2 = ""
cl2 = 1
end if
end if
loop
binarytostring = pl1 & pl2 & pl3
end function
binarytostring方法比simplebinarytostring方法性能高20倍。建議用來處理2mb以下的數據。
第二種方法:使用adodb.recordset
adodb.recordset 可以讓你支持幾乎所有variant支持的數據類型,你可以用它在string和
binary之間轉換。
function rsbinarytostring(xbinary)
antonin foller, http://www.pstruh.cz
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
rsbinarytostring 沒有什麼限制--除了物理內存之外。這種處理方式是multibyte方式的100倍!你可以用它來處理高達100mb的數據! 這種轉換方式,你也可以用來把multibyte strings轉換爲string。下面這個方法把multibyte strings轉換爲binary:function multibytetobinary(multibyte)
&copy; 2000 antonin foller, http://www.pstruh.cz
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
第三種:使用adodb.stream這種方式是比較常用的:stream_binarytostring function
2003 antonin foller, http://www.pstruh.cz
binary - vt_ui1 | vt_array data to convert to a string
charset - charset of the source binary data - default is "us-ascii"
function stream_binarytostring(binary, charset)
const adtypetext = 2
const adtypebinary = 1

create stream object
dim binarystream as new stream
set binarystream = createobject("adodb.stream")

specify stream type - we want to save text/string data.
binarystream.type = adtypebinary

open the stream and write text/string data to the object
binarystream.open
binarystream.write binary


change stream type to binary
binarystream.position = 0
binarystream.type = adtypetext

specify charset for the source text (unicode) data.
if len(charset) > 0 then
binarystream.charset = charset
else
binarystream.charset = "us-ascii"
end if

open the stream and get binary data from the object
stream_binarytostring = binarystream.readtext
end function
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章