在VBS中定义字节数组Byte()介绍
程序员文章站
2022-08-27 15:40:16
晚上在 qq 上看到昵称为“乱码”的好友回答了搜搜问问里一个问题: 在vbs中有办法定义字节数组么? 在vbs中有办法定义字节数组么?就是字节子类型数组(vartype是8...
晚上在 qq 上看到昵称为“乱码”的好友回答了搜搜问问里一个问题:
在vbs中有办法定义字节数组么?
在vbs中有办法定义字节数组么?就是字节子类型数组(vartype是8209的那种)注意不是vb!
但是回答实在是不堪入目,连别人问什么都没搞懂,而且那人居然还满意,真不知道他在想什么。
闲来没事,我来简单回答一下。首先要搞清楚别人在问什么,vbs 是弱类型脚本语言,只有一种数据类型,称为 variant,但是 variant 可以进一步分为几种子类型,这里不展开,详见《vbscript 数据类型》。所谓字节子类型数组(vartype是8209的那种),就是子类型为 byte 的数组(vbbyte + vbarray = 17 + 8192 = 8209)。
例如,msxml2.xmlhttp 对象的 responsebody 属性返回的就是字节数组:
'author: demon
'website: http://demon.tw
'date: 2012/2/22
dim http, res
set http = createobject("msxml2.xmlhttp")
http.open "get", "http://demon.tw", false
http.send
res = http.responsebody
wscript.echo vartype(res), typename(res)
再例如,adodb.stream 对象的 read 方法返回的也是字节数组:
'author: demon
'website: http://demon.tw
'date: 2012/2/22
dim ado, data
set ado = createobject("adodb.stream")
ado.type = 1
ado.open
ado.loadfromfile "demon.tw"
data = ado.read
wscript.echo vartype(data), typename(data)
那么如何在 vbs 中定义一个字节数组呢?有人说那还不简单,用 cbyte 函数强制转换一下不就行了?真的是这样么,写个简单的例子测试一下:
'author: demon
'website: http://demon.tw
'date: 2012/2/22
dim a(9), i
for i = 0 to 9
a(i) = cbyte(i)
next
wscript.echo vartype(a), typename(a)
'输出 8204 variant()程序输出 8204 variant(),很可惜,这不是我们想要的。
那么正确的方法是什么呢?其实在《用vbs读写二进制文件的另一种方法》中出现过,使用 msxml2.domdocument 对象:
'author: demon
'website: http://demon.tw
'date: 2012/2/22
dim xmldoc, node, bytes
set xmldoc = createobject("msxml2.domdocument")
set node = xmldoc.createelement("binary")
node.datatype = "bin.hex"
'demon.tw 的十六进制值为
'64 65 6d 6f 6e 2e 74 77
node.text = "64656d6f6e2e7477"
bytes = node.nodetypedvalue
wscript.echo vartype(bytes), typename(bytes)
这样 bytes 变量就是字节数组了,如果你知道其他的方法,欢迎不吝赐教。
原文:
在vbs中有办法定义字节数组么?
在vbs中有办法定义字节数组么?就是字节子类型数组(vartype是8209的那种)注意不是vb!
但是回答实在是不堪入目,连别人问什么都没搞懂,而且那人居然还满意,真不知道他在想什么。
闲来没事,我来简单回答一下。首先要搞清楚别人在问什么,vbs 是弱类型脚本语言,只有一种数据类型,称为 variant,但是 variant 可以进一步分为几种子类型,这里不展开,详见《vbscript 数据类型》。所谓字节子类型数组(vartype是8209的那种),就是子类型为 byte 的数组(vbbyte + vbarray = 17 + 8192 = 8209)。
例如,msxml2.xmlhttp 对象的 responsebody 属性返回的就是字节数组:
复制代码 代码如下:
'author: demon
'website: http://demon.tw
'date: 2012/2/22
dim http, res
set http = createobject("msxml2.xmlhttp")
http.open "get", "http://demon.tw", false
http.send
res = http.responsebody
wscript.echo vartype(res), typename(res)
再例如,adodb.stream 对象的 read 方法返回的也是字节数组:
复制代码 代码如下:
'author: demon
'website: http://demon.tw
'date: 2012/2/22
dim ado, data
set ado = createobject("adodb.stream")
ado.type = 1
ado.open
ado.loadfromfile "demon.tw"
data = ado.read
wscript.echo vartype(data), typename(data)
那么如何在 vbs 中定义一个字节数组呢?有人说那还不简单,用 cbyte 函数强制转换一下不就行了?真的是这样么,写个简单的例子测试一下:
复制代码 代码如下:
'author: demon
'website: http://demon.tw
'date: 2012/2/22
dim a(9), i
for i = 0 to 9
a(i) = cbyte(i)
next
wscript.echo vartype(a), typename(a)
'输出 8204 variant()程序输出 8204 variant(),很可惜,这不是我们想要的。
那么正确的方法是什么呢?其实在《用vbs读写二进制文件的另一种方法》中出现过,使用 msxml2.domdocument 对象:
复制代码 代码如下:
'author: demon
'website: http://demon.tw
'date: 2012/2/22
dim xmldoc, node, bytes
set xmldoc = createobject("msxml2.domdocument")
set node = xmldoc.createelement("binary")
node.datatype = "bin.hex"
'demon.tw 的十六进制值为
'64 65 6d 6f 6e 2e 74 77
node.text = "64656d6f6e2e7477"
bytes = node.nodetypedvalue
wscript.echo vartype(bytes), typename(bytes)
这样 bytes 变量就是字节数组了,如果你知道其他的方法,欢迎不吝赐教。
原文:
上一篇: QWERTY密码:加密与解密vbs版
下一篇: 用VBS精确计算2的100次方的代码