我正在使用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,但我仍然不明白发生了什么。
答案 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)
当函数看到它时,该数字已经是(负)有符号的短整数。