用VBS读写二进制文件的另一种方法分享
程序员文章站
2022-08-27 15:13:11
之前写的那篇给出的方法虽然不错,但是当文件过大时(其实很小,也就几m),对应的数组也会很大,然后会出现运行时错误,提示内存耗尽,为此我郁闷了好久。 最近在博客的流量记录中发...
之前写的那篇给出的方法虽然不错,但是当文件过大时(其实很小,也就几m),对应的数组也会很大,然后会出现运行时错误,提示内存耗尽,为此我郁闷了好久。
最近在博客的流量记录中发现百度关键字“一些很恶作剧的vbs程序”(看来现在的年轻人很喜欢玩这口),于是打开久违的百度搜索了一下,发现出现在第三。出现在第二的是百度hi,上面也是一个恶作剧程序,而且还是加密的。我尝试着解密,却发现这个加密似乎比前几天解密的那个病毒更变态,未果。
虽然我没有把那个程序解密出来(如果哪位真正的高手会,麻烦指点一下),但是从中领悟出了用vbs读写二进制文件的另一种方法,即microsoft.xmldom+adodb.stream。这个方法的效率比原来那个高得多,而且似乎没有文件大小限制。
function readbinary(filename)
const adtypebinary = 1
dim stream, xmldom, node
set xmldom = createobject("microsoft.xmldom")
set node = xmldom.createelement("binary")
node.datatype = "bin.hex"
set stream = createobject("adodb.stream")
stream.type = adtypebinary
stream.open
stream.loadfromfile filename
node.nodetypedvalue = stream.read
stream.close
set stream = nothing
readbinary = node.text
set node = nothing
set xmldom = nothing
end function
函数的参数是要读取的文件路径,返回值是包含二进制文件的十六进制值的字符串。
sub writebinary(filename, buf)
const adtypebinary = 1
const adsavecreateoverwrite = 2
dim stream, xmldom, node
set xmldom = createobject("microsoft.xmldom")
set node = xmldom.createelement("binary")
node.datatype = "bin.hex"
node.text = buf
set stream = createobject("adodb.stream")
stream.type = adtypebinary
stream.open
stream.write node.nodetypedvalue
stream.savetofile filename, adsavecreateoverwrite
stream.close
set stream = nothing
set node = nothing
set xmldom = nothing
end sub
第一个参数是要读入的文件路径,第二个参数是包含二进制文件的十六进制值的字符串。至于如何获得二进制文件的十六进制值,那方法就很多了,最简单的方法当然就是用fso对象将readbinary函数的返回值写到文本文件中去,然后ctrl+c,ctrl+v。其实用十六进制工具也很简单。
其他的就不多说了,看不懂的多看看msdn参考文档。写了一个示例程序,里面包含了天空之城音乐的所有数据,双击后在同一文件夹生成天空之城的mp3文件并播放。
原文:
最近在博客的流量记录中发现百度关键字“一些很恶作剧的vbs程序”(看来现在的年轻人很喜欢玩这口),于是打开久违的百度搜索了一下,发现出现在第三。出现在第二的是百度hi,上面也是一个恶作剧程序,而且还是加密的。我尝试着解密,却发现这个加密似乎比前几天解密的那个病毒更变态,未果。
虽然我没有把那个程序解密出来(如果哪位真正的高手会,麻烦指点一下),但是从中领悟出了用vbs读写二进制文件的另一种方法,即microsoft.xmldom+adodb.stream。这个方法的效率比原来那个高得多,而且似乎没有文件大小限制。
复制代码 代码如下:
function readbinary(filename)
const adtypebinary = 1
dim stream, xmldom, node
set xmldom = createobject("microsoft.xmldom")
set node = xmldom.createelement("binary")
node.datatype = "bin.hex"
set stream = createobject("adodb.stream")
stream.type = adtypebinary
stream.open
stream.loadfromfile filename
node.nodetypedvalue = stream.read
stream.close
set stream = nothing
readbinary = node.text
set node = nothing
set xmldom = nothing
end function
函数的参数是要读取的文件路径,返回值是包含二进制文件的十六进制值的字符串。
复制代码 代码如下:
sub writebinary(filename, buf)
const adtypebinary = 1
const adsavecreateoverwrite = 2
dim stream, xmldom, node
set xmldom = createobject("microsoft.xmldom")
set node = xmldom.createelement("binary")
node.datatype = "bin.hex"
node.text = buf
set stream = createobject("adodb.stream")
stream.type = adtypebinary
stream.open
stream.write node.nodetypedvalue
stream.savetofile filename, adsavecreateoverwrite
stream.close
set stream = nothing
set node = nothing
set xmldom = nothing
end sub
第一个参数是要读入的文件路径,第二个参数是包含二进制文件的十六进制值的字符串。至于如何获得二进制文件的十六进制值,那方法就很多了,最简单的方法当然就是用fso对象将readbinary函数的返回值写到文本文件中去,然后ctrl+c,ctrl+v。其实用十六进制工具也很简单。
其他的就不多说了,看不懂的多看看msdn参考文档。写了一个示例程序,里面包含了天空之城音乐的所有数据,双击后在同一文件夹生成天空之城的mp3文件并播放。
原文: