用VBS读写二进制文件的另一种方法分享_vbs

之前写的那篇给出的方法虽然不错,但是当文件过大时(其实很小,也就几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文件并播放。

原文:http://demon.tw/programming/vbs-binary-file-another.html

时间: 2024-09-17 04:02:06

用VBS读写二进制文件的另一种方法分享_vbs的相关文章

二进制文件随机存取的两种方法

以下是本人使用C++实现二进制文件随机存取的两种常用方法,写出来,让您见笑,还望方家点拨. 第一种方法:根据记录编号,对每一条记录固定位置存取,实现随机存取 设计思想: 每一条记录的记录编号,决定该记录的存取位置.如:第一条记录记录编号是1,放在位置1:第二条记录的记录编号是2,放在位置2:---,依次类推. 要修改第二条记录,首先根据记录编号计算出该记录的存储位置,然后将内置指针直接调至此处,进行修改. 新添记录,可根据它的记录编号存储到文件的相应位置. 这种随机存取方法通俗易懂,简便易行.适

VBS读取注册表的两种方法_vbs

第一种 通过wshshell对象的regread 复制代码 代码如下: RegValue = CreateObject("Wscript.Shell").RegRead("\XXXX_XXXXXXXX_XXX\XXX\XXXX")Msgbox(RegValue) 更多的操作可以参考这篇文章 http://www.jb51.net/article/18125.htm 第二种方法: 通过wmi 复制代码 代码如下: Const HKLM = &H80000002

Shell.Application执行命令的五种方法小结_vbs

当初老马写这个版本时,我测试过简繁两个2003版本的,当是是好用的.我猜测很可能与2003打了ms06014补丁有关.kyo在冰点论坛提出了解决方法,我今天下午研究了一下这个组件,发现它有5种方法可以执行命令.以下是vbs版本(asp版不提供了,如何利用asp版本在2003的webshell中运行命令,自己解决吧:-): 复制代码 代码如下: Set objShellApp = CreateObject("Shell.Application") Set objFolder = objS

在jsp页面中响应速度提高的7种方法分享_JSP编程

方法一:在servlet的init()方法中缓存数据当应用服务器初始化servlet实例之后,为客户端请求提供服务之前,它会调用这个servlet的init()方法.在一个servlet的生命周期中,init()方法只会被调用一次.通过在init()方法中缓存一些静态的数据或完成一些只需要执行一次的.耗时的操作,就可大大地提高系统性能.例如,通过在init()方法中建立一个JDBC连接池是一个最佳例子,假设我们是用jdbc2.0的DataSource接口来取得数据库连接,在通常的情况下,我们需要

linux使用shell搜索查找文本的几种方法分享

  日志的大小很大,服务器一般也是Linux.HP.AIX等,每次都下载回来就麻烦的要命,在开源中国看到下面内容,很实用. 1.使用find和xargs命令 代码如下: find dir | xargs grep str # dir是指某个目录 find file | xargs grep str # file是指某个文件2. 第2种方法是直接使用grep命令 代码如下: grep str dir/* # dir是指某个目录,但不递归搜索其子目录 grep -r str dir/* #使用-r选

json解析的四种方法分享

 这篇文章主要介绍了json解析的四种方法,有需要的朋友可以参考一下 Json在Web开发的用处非常广泛,作为数据传递的载体,如何解析Json返回的数据是非常常用的.下面介绍下四种解析Json的方式:   Part 1   代码如下: var list1 = [1,3,4]; alert(list1[1]); var list2 = [{"name":"leamiko","xing":"lin"}]; alert(list2[

javascript中取前n天日期的两种方法分享

 这篇文章主要介绍了javascript中取前n天日期的两种方法,有需要的朋友可以参考一下 方法一:   代码如下: var d = new Date();   d = new Date(d.getFullYear(),d.getMonth(),d.getDate()-n);         方法二:    代码如下: var now = new Date();   now.setTime(now.getTime()-n*24*60*60*1000);  

java获取当前日期和时间的二种方法分享_java

有两种方法:方法一:用java.util.Date类来实现,并结合java.text.DateFormat类来实现时间的格式化,看下面代码: 复制代码 代码如下: import java.util.*;import java.text.*;//以下默认时间日期显示方式都是汉语语言方式//一般语言就默认汉语就可以了,时间日期的格式默认为MEDIUM风格,比如:2008-6-16 20:54:53//以下显示的日期时间都是再Date类的基础上的来的,还可以利用Calendar类来实现见类TestDa

gridview实现服务器端和客户端全选的两种方法分享_实用技巧

复制代码 代码如下: <%@ Page Language="C#" AutoEventWireup="true"%> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <script runat="