如何在VB中正确地进行有符号数和无符号数的相互转换
在软件逆向算法过程中,常常会用到十六进制的数值来赋值给变量。然而,在VB中,默认数值为有符号型数据,正数最大值为2147483647,若大于这个值的数则都被表示为负数。这导致了很多人因此放弃VB,改用其他语言。
但是,通过自制函数Unsigned()和Signed(),我们可以在VB中正确地进行有符号数和无符号数的相互转换。
一、自制函数源代码
以下是函数Unsigned()的代码,它接收参数hNum为十六进制数。当大于等于“amp;H80000000”的数都是负数时,以“amp;H70000000”作为分界线,只要大于“amp;H70000000”就减“amp;H70000000”,然后相加即可。
Public Function Unsigned(hNum As String) As Double
Dim isDbl As Double, fNum As Byte
If InStr(hNum, "amp;H") Then hNum Replace(hNum, "amp;H", "")
If Len(hNum) lt; 8 Then
isDbl "amp;H" amp; hNum
Else
fNum "amp;H" amp; Left(hNum, 1)
Do
If fNum gt; 7 Then
fNum fNum - 7
isDbl isDbl amp; "amp;H70000000"
Else
isDbl isDbl amp; ("amp;H" amp; fNum amp; Right(hNum, 7))
Exit Do
End If
Loop
End If
Unsigned isDbl
End Function
以下是函数Signed()的代码,它可以将大于2147483647的数全部减去4294967296(即:十六进制“amp;H100000000”,一个1,八个0)。
Public Function Signed(ByVal hNum As Double) As Double
If hNum lt; 4294967296 And hNum gt; 2147483647 Then
hNum hNum - 4294967296
End If
Signed hNum
End Function
二、测试
下面是一个测试的例子:
Sub Test()
Dim Eax As Double, Ebx As Double, Ecx As Double
Ebx "amp;H87654321"
Eax Unsigned("87654321")
Ecx Signed(Eax)
Eax, Ebx, Ecx
End Sub
输出结果为:
2271560481 -2023406815 -2023406815
可以看到,Eax和Ecx的值相同,均为-2023406815,正确地完成了有符号数和无符号数之间的转换。
通过以上的自制函数,我们可以在VB中更好地操作十六进制数值,轻松地解决了有符号数和无符号数的相互转换问题。
版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。