JS/VBS配合Adodb.Stream处理字节数据/输出二进制文件
2010年06月30日
一开始,我曾想到将字节数据转换为JS字符串,每两个字节一组转换为一个字节,然后写入类型为文本、编码为"Unicode"的Adodb.Stream对象。
这样做有下面这些问题,但各有方法解决:
首先,将字节数据转换为双字节字符必须要考虑高低位字节顺序(Byte Order)的问题。关系到JS字符串字节顺序的到底是硬件还是软件,目前我还无从得知。不过在目前一般Windows的IE/JScript 5.7中,JS字符串是高位在前低位在后(little endian)。解决方法:在字节对转换成字符前,先将高低字节数据调换。
其次,当字节数据的长度为奇数时,必然存在最后不够凑齐一对字节转换为字符的问题。解决方法:可以先在数据尾部任意补充一个字节,待数据写入Stream对象之后,再将Stream对象转换为二进制类型并移除最后一个字节。
再者,Adodb.Stream在的编码为Unicode时,会自动在文本流的开始位置加入两个字节的BOM(Byte Order Mark)。解决方法:将已经写入数据的Stream类型转换为二进制,此时从第3个字节起读出的所有数据即为我们需要的数据。 // 两种生成字符串的方法任选其一 function getDataString() { var s = ''; for (var i = 0; i VBS来实现,是否可以大大精简代码?
于是我想先试试,通过朝Stream中写入单字节数据的方法是否可行。
可惜经过实践发现,作为VB阉割版的VBS也不能直接支持字节数组的创建,要想往Stream中写入自定义的数据,还是得通过字符串文本。
那么再试试往编码为"iso8859-1"的Stream中写入"单字节字符",结果ChrB()函数返回的单字节值写不进去,而Chr()函数对大于127的数据不能正确处理。
最后发现,ChrW()能正确处理0~255的数据并写入编码为"iso8859-1"的Stream中。实际写入的只有低字节,高位0均被舍弃。
而且这么做还省去了处理字节顺序和BOM的问题。 Dim i, stream Set stream = CreateObject("Adodb.Stream") stream.Mode = 3 stream.Open stream.Type = 2 stream.Charset = "iso8859-1" For i = 0 To 256 - 1 stream.WriteText ChrW(i) Next stream.SaveToFile "256bytes.bin" stream.Close 进一步推断,其实VBS的ChrW()就相当于JS的fromCharCode(),所以在JS中也能直接用这种更简单的方式来处理 var a = []; for (var i = 0; i 脚本引擎自身的效率。
发表评论
-
用Wscript的Arguments属性实现vbs的命令行参数形式启动
2012-01-20 02:13 1236用Wscript的Arguments属性实现vbs的命令行参数 ... -
VBS--自动定时截图工具
2012-01-20 02:13 1080VBS--自动定时截图工具 2010年09月01日 一、 ... -
使用 Iisftp.vbs 创建 FTP 站点
2012-01-20 02:13 673使用 Iisftp.vbs 创建 FTP ... -
CuteFTP上传脚本(VBS)
2012-01-20 02:13 640CuteFTP上传脚本(VBS) 2010年08月13日 ... -
Service程序
2012-01-19 10:03 478Service程序 2010年12月13日 用ATL非常 ... -
调用规范与可变参数表
2012-01-19 10:03 581调用规范与可变参数表 ... -
编程基本
2012-01-19 10:03 470编程基本 2011年09月03日 繁 -
观察者模式
2012-01-19 10:03 574观察者模式 2011年12月19日 class JPDe ... -
12.29遛狗日记
2012-01-19 10:03 69512.29遛狗日记 2011年12月30日 01.18 ... -
如何导出wince6.0的SDK 添加MFC支持
2012-01-17 02:44 692如何导出wince6.0的SDK 添加MFC支持 2010年 ... -
Windows下NDK开发环境的搭建(Cygwin+Android-SDK+NDK)
2012-01-17 02:44 513Windows下NDK开发环境的搭 ... -
SDK详解
2012-01-17 02:44 562SDK详解 2010年11月01日 sdk SDK( ... -
sdk
2012-01-17 02:44 661sdk 2011年05月19日 SD ... -
微软计划今春推Kinect Windows SDK开发工具
2012-01-17 02:44 518微软计划今春推Kinect Windows SDK开发工具 ... -
RIA
2012-01-15 22:20 568RIA 2010年04月12日 Ja ... -
Java和flash通信中数据的zlib压缩与解压缩
2012-01-15 22:20 825Java和flash通信中数据的zlib压缩与解压缩 200 ... -
ArcGIS Server for Flex 资源收集
2012-01-15 22:20 539ArcGIS Server for Flex 资源 ... -
TWaver Flex会给电信软件开发带来变革吗?
2012-01-15 22:20 641TWaver Flex会给电信软件开发带来变革吗? 2010 ... -
天地会flash资源导航
2012-01-15 22:20 2023天地会flash资源导航 2011年02月25日 一 f ...
相关推荐
使用vbs读写文件(Adodb.Stream)方式,防止乱码
vb adodb stream aeecss adodb resouse recordset
Adodb.Stream是ADO的Stream对象,提供存取二进制数据或者文本流,从而实现对流的读、写和管理等操作及各种方法的使用。 http://www.abo518.cn
卸载/恢复ADODB.Stream的软件
adodb.stream 模仿sina的天气预报
adodb.stream
字节编写或者收集的VBS函数集,涉及二进制,文件读写,UTF-8,ANSI编码转换,Http GET,POST,网络请求功能。base64编码解码函数。等等。
ADODB.Stream组件Charset属性值集合
代码如下:‘函数名称:ReadTextFile ‘作用:利用AdoDb.Stream对象来读取UTF-8格式的文本文件 ‘—————————————————- Function ReadFromTextFile (FileUrl,CharSet) If FileUrl = “” OR Is...
主要介绍了adodb.recordset.open(rs.open)方法参数详解,需要的朋友可以参考下
用ADODB.Stream转换
<%...‘—————利用xmlhttp和adodb.stream—————–‘On Error Resume Next‘——————————-定义输出格式—————————–path=request(“path”)if path =”” thenpath=”...
asp adodb.stream对象的方法/属性
asp之基于adodb.stream的文件操作类
尝试过 防盗链,不太理想,最终使用了 Adodb.Stream 读取,直接输出。 解决了 盗版的问题,但是新的问题又来了。Adodb.Stream 这种方式 电脑还好说,大部分电脑浏览器都支持。移动端 很多 浏览器为了 加速读取,会多...
一开始使用ASCII编码来读取文本数据,模拟读取二进制数据,但是发现如果字符编码大于127时,只会得到小于128的值,相当于和128取余了,因此ASCII编码是不行的。 继续寻找,在CodeProejct.com找到一篇文章《Reading ...
在ASP中,我们常用Scripting.FileSystemObject组件来读写文本文件,但它有一个缺点是对编码支持不足,比如我们想读写一个utf-8文本文件,FSO就很难办到了,这时我们就需要使用Adodb.Stream组件来代替它。
利用MSXML2.XmlHttp和Adodb.Stream 代码如下:<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”> <html xmlns=”...