如何在VB中正確地進(jìn)行有符號(hào)數(shù)和無符號(hào)數(shù)的相互轉(zhuǎn)換
在軟件逆向算法過程中,常常會(huì)用到十六進(jìn)制的數(shù)值來賦值給變量。然而,在VB中,默認(rèn)數(shù)值為有符號(hào)型數(shù)據(jù),正數(shù)最大值為2147483647,若大于這個(gè)值的數(shù)則都被表示為負(fù)數(shù)。這導(dǎo)致了很多人因此放棄VB,改用
在軟件逆向算法過程中,常常會(huì)用到十六進(jìn)制的數(shù)值來賦值給變量。然而,在VB中,默認(rèn)數(shù)值為有符號(hào)型數(shù)據(jù),正數(shù)最大值為2147483647,若大于這個(gè)值的數(shù)則都被表示為負(fù)數(shù)。這導(dǎo)致了很多人因此放棄VB,改用其他語言。
但是,通過自制函數(shù)Unsigned()和Signed(),我們可以在VB中正確地進(jìn)行有符號(hào)數(shù)和無符號(hào)數(shù)的相互轉(zhuǎn)換。
一、自制函數(shù)源代碼
以下是函數(shù)Unsigned()的代碼,它接收參數(shù)hNum為十六進(jìn)制數(shù)。當(dāng)大于等于“amp;H80000000”的數(shù)都是負(fù)數(shù)時(shí),以“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
以下是函數(shù)Signed()的代碼,它可以將大于2147483647的數(shù)全部減去4294967296(即:十六進(jìn)制“amp;H100000000”,一個(gè)1,八個(gè)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
二、測(cè)試
下面是一個(gè)測(cè)試的例子:
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
輸出結(jié)果為:
2271560481 -2023406815 -2023406815
可以看到,Eax和Ecx的值相同,均為-2023406815,正確地完成了有符號(hào)數(shù)和無符號(hào)數(shù)之間的轉(zhuǎn)換。
通過以上的自制函數(shù),我們可以在VB中更好地操作十六進(jìn)制數(shù)值,輕松地解決了有符號(hào)數(shù)和無符號(hào)數(shù)的相互轉(zhuǎn)換問題。