在VBS中定义字节数组Byte()

标签: , , , , ,

晚上在 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 变量就是字节数组了,如果你知道其他的方法,欢迎不吝赐教。

赞赏

微信赞赏支付宝赞赏

随机文章:

  1. BAT批处理编辑器Superbat
  2. WMI入门教程:第三部分
  3. PT作弊的几种方法
  4. OpenWrt Dnsmasq DHCP MAC地址过滤
  5. WordPress中的__()和_e()函数的作用

4 条评论 发表在“在VBS中定义字节数组Byte()”上

  1. […] Demon's Blog  »  程序设计  »  VBS字节数组Byte()的处理方法 « 在VBS中定义字节数组Byte() […]

  2. 雨中风铃说道:

    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)

  3. powerground说道:

    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)),会提示无法转换。网上查了很久也找不到解决办法,请求您的帮助。谢谢了。

    • powerground说道:

      搞定了,呵呵,看了您的另一篇文章,用AscB就可以了,谢谢Demon,敬礼。

留下回复