成人AV在线无码|婷婷五月激情色,|伊人加勒比二三四区|国产一区激情都市|亚洲AV无码电影|日av韩av无码|天堂在线亚洲Av|无码一区二区影院|成人无码毛片AV|超碰在线看中文字幕

如何在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)換問題。

標(biāo)簽: