曾经写过一篇《用JavaScript读写二进制文件》,其实严格的说是JScript,但是很多不明真相的同学根本不区分。内容摘自CodeProject《Reading and Writing Binary Files Using JScript》一文。最近要用JScript处理一些二进制的*.torrent文件,重新看了一遍原文,发现有人在回复中提供了一种更简洁的方法
文章关键字 ‘binary’
用JavaScript读写二进制文件的另一种方法
2011年04月21日,星期四用VBS读写二进制文件的另一种方法
2010年07月26日,星期一之前写的那篇给出的方法虽然不错,但是当文件过大时(其实很小,也就几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文件并播放。
[download id=29]
用JavaScript读写二进制文件
2010年07月14日,星期三中文网上的垃圾代码我就不评论了,我已经词穷了。终于知道为什么不懂英语就学不好编程了,因为中文网站上的代码垃圾透了。不解释,你分别Google关键词“JavaScript 二进制文件”和“javascript binary file”,对比搜索出来的第一个网页就知道了。也行不同的时候搜出来的不一样,反正我搜出来的分别是如何用JavaScript读写二进制文件?和Reading and Writing Binary Files Using JScript。什么是差距,这就是差距。
用VBS读写二进制文件
2010年06月18日,星期五网上关于VBS读写二进制文件和二进制数据的文章很少,估计是高手们都很忙,那就由我这个菜鸟来写吧。不知道会不会被很多人复制粘贴然后还不注明出处,应该是会的。恩,我要好好学习知识产权法。
查了很多资料,很多不明真相的同学都叫嚣说用adodb.stream对象就可以实现。不错,是通过adodb.stream实现读写二进制文件的功能,问题是如何实现,你有自己测试过吗?给出的代码都是先用adodb.stream对象读取,然后又写入,这样做有什么意义,还不如直接复制。我想实现的是用adodb.stream直接写我保存在代码中的数据。我试过使用adodb.stream对象的write方法,但是每次都弹出"ADODB.Stream: Arguments are of the wrong type, are out of acceptable range, or are in conflict with one another."错误。想到Linux之父Torvalds Linus的一句话:“Talk is cheap. Show me the code.”光说有什么用,把代码给出来啊。没有代码,就不要说话。
下面是读写二进制文件的两个函数(过程),并不是我写的,我没有那么高的水平,也没有那么厚的脸皮说是我写的,而是国外一位VBS高人写的,膜拜之。ReadBinary函数从文件读取二进制数据并返回数组,WriteBinary将数组中的数据以二进制的形式写到文件中。
Function ReadBinary(FileName) Dim Buf(), I With CreateObject("ADODB.Stream") .Mode = 3: .Type = 1: .Open: .LoadFromFile FileName ReDim Buf(.Size - 1) For I = 0 To .Size - 1: Buf(I) = AscB(.Read(1)): Next .Close End With ReadBinary = Buf End Function Sub WriteBinary(FileName, Buf) Dim I, aBuf, Size, bStream Size = UBound(Buf): ReDim aBuf(Size \ 2) For I = 0 To Size - 1 Step 2 aBuf(I \ 2) = ChrW(Buf(I + 1) * 256 + Buf(I)) Next If I = Size Then aBuf(I \ 2) = ChrW(Buf(I)) aBuf=Join(aBuf, "") Set bStream = CreateObject("ADODB.Stream") bStream.Type = 1: bStream.Open With CreateObject("ADODB.Stream") .Type = 2 : .Open: .WriteText aBuf .Position = 2: .CopyTo bStream: .Close End With bStream.SaveToFile FileName, 2: bStream.Close Set bStream = Nothing End Sub
非常的强大,我写了一个示例程序,用WriteBinary过程写了一张图片,感兴趣的可以下载来测试一下。
[download id=13]