为什么VBScript是按位而且在一个案例中失败?

时间:2016-08-11 21:11:00

标签: vbscript bit-manipulation bitwise-operators

我正在使用VBScript解析一些Windows安装程序内部的返回代码。我想确认我正在做正确的事情,所以我记下了一些Echo语句,发现其中一个没有产生我预期的结果:

WScript.Echo (&H01010101)                ' prints 16843009 (0x01010101). Correct!
WScript.Echo (&H01010101 And &Hff000000) ' prints 16777216 (0x01000000). Correct!
WScript.Echo (&H01010101 And &H00ff0000) ' prints 65536    (0x00010000). Correct!
WScript.Echo (&H01010101 And &H0000ff00) ' prints 16843008 (0x01010100). What's happening here?
WScript.Echo (&H01010101 And &H000000ff) ' prints 1        (0x00000001). Correct!

第四个似乎只掩盖了底部的两个字节。好吧,当然,我想我可以看到它可能会被转换为最小的int,它可以在它被And之前保持它,因此掩码比被屏蔽的东西短或类似的东西,但是为什么呢?最后的案例工作?

如果我在最高字节中输入一些东西,它就会起作用:

WScript.Echo (&H01010101 And &Hf000ff00) ' prints 256      (0x01010100).

以及其他一些案例:

WScript.Echo (&H01010101 And &H0000f0ff) ' prints 16842753 (0x01010001).
WScript.Echo (&H01010101 And &Hf00000ff) ' prints 1        (0x00000001).

哪种支持它存储在WORD中的想法,而不是DWORD,但我仍然不明白发生了什么。

1 个答案:

答案 0 :(得分:4)

&h0000ff00不是解释为Long,而是解释为整数,在VBScript中是16-bit (short) signed integer

  

Integer:包含-32,768到32,767范围内的整数。

有符号整数使用Two's Complement进行编码,这意味着以1开头的位序列被解释为负数。因此,值&hff00变为-256。

您的其他示例不会触发此行为,因为它们要么大于16位,所以它们会被自动视为长,或者小于&h8000(32768,或二进制1000 0000 0000 0000),因此它们是正整数。

为了避免这个陷阱,请告诉口译员通过附加另一个&符将数字视为Long:

WScript.Echo (&h01010101 And &h0000ff00&)

或使用小数值:

WScript.Echo (&h01010101 And 65280)

您还可以将十六进制数定义为字符串,并使用CLng函数将其转换为Long:

WScript.Echo (&h01010101 And CLng("&h0000ff00"))

但是,仅使用十六进制数字上的CLng即可。如果您尝试过这样的事情:

CLng(&h0000ff00)

当函数看到它时,该数字已经是(负)有符号的短整数。