标题: 在VBS中定义字节数组Byte()
作者: Demon
链接: https://demon.tw/programming/vbs-byte-array.html
版权: 本博客的所有文章,都遵守“署名-非商业性使用-相同方式共享 2.5 中国大陆”协议条款。
晚上在 QQ 上看到昵称为“乱码”的好友回答了搜搜问问里一个问题:
在VBS中有办法定义字节数组么?
在VBS中有办法定义字节数组么?就是字节子类型数组(VarType是8209的那种)注意不是VB!
但是回答实在是不堪入目,连别人问什么都没搞懂,而且那人居然还满意,真不知道他在想什么。
闲来没事,我来简单回答一下。首先要搞清楚别人在问什么,VBS 是弱类型脚本语言,只有一种数据类型,称为 Variant,但是 Variant 可以进一步分为几种子类型,这里不展开,详见《VBScript 数据类型》。所谓字节子类型数组(VarType是8209的那种),就是子类型为 Byte 的数组(vbByte + vbArray = 17 + 8192 = 8209)。
例如,Msxml2.XMLHTTP 对象的 responseBody 属性返回的就是字节数组:
'Author: Demon 'Website: https://demon.tw 'Date: 2012/2/22 Dim http, res Set http = CreateObject("Msxml2.XMLHTTP") http.open "GET", "https://demon.tw", False http.send res = http.responseBody WScript.Echo VarType(res), TypeName(res)
再例如,ADODB.Stream 对象的 Read 方法返回的也是字节数组:
'Author: Demon 'Website: https://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: https://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: https://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 变量就是字节数组了,如果你知道其他的方法,欢迎不吝赐教。
赞赏微信赞赏支付宝赞赏
随机文章:
[…] Demon's Blog » 程序设计 » VBS字节数组Byte()的处理方法 « 在VBS中定义字节数组Byte() […]
Dim objRS, strText, Bytes
strText = "64656D6F6E2E7477" 'demon.tw的十六进制值
Set objRS = WScript.CreateObject("ADODB.Recordset")
objRS.Fields.Append "Temp", 204, LenB(strText)/2+1
objRS.Open
objRS.AddNew
objRS("Temp") = strText
objRS.Update
objRS.MoveFirst
Bytes = objRS("Temp")
objRS.Close
Set objRS = Nothing
WScript.Echo VarType(Bytes), TypeName(Bytes)
Demon,您好。我是个vbs菜鸟,最近用利用Mscomm控件做串口通讯。仪表串口使用的是MODBUS-RTU方式协议,PC从该仪表采集到的数据类型为一个字节数组。我使用了您的方式在vbs中定义了字节数组,并将采集到的数据赋给该数组,代码如下:
Dim xmldoc, node, bytes
Set xmldoc = CreateObject(“Msxml2.DOMDocument”)
Set node = xmldoc.createElement(“binary”)
node.dataType = “bin.hex”
‘node.text = “010300230020B5D8”
node.nodeTypedValue = objMSComm.Input ‘objMSComm.Input 为从仪表采集到的字节数组
bytes = node.nodeTypedValue
我想遍历bytes数组,得到所有字节的十进制数值(可能大于128),按照您另一篇文章的遍历方法可以遍历到所有字符,但是却转不成十进制数值,比如Asc(MidB(bytes, 1 ,1)),会提示无法转换。网上查了很久也找不到解决办法,请求您的帮助。谢谢了。
搞定了,呵呵,看了您的另一篇文章,用AscB就可以了,谢谢Demon,敬礼。