Miten visual basicillä voisi laskea hexadesimaalisen luvun esim: FF joka on 255 normaaliksi kymmenjärjestelmäluvuksi?
Onko siinä jotain valmista funktiota tai jotain jolla sen voisi laskea vai pitääkö itsekeksiä laskutapa? jos itse pitää keksiä niin miten olisi parasta tehdä se?
Tällain hauskasti voi kikkailla:
kymmenjärjestelmässä = Val("&H" & heksajärjestelmässä)VB:ssä heksat ilmoitetaan &H-etuliitteellä, ja Val ymmärtää ne.
Muunnokseen voi käyttää Val-funktiota, kunhan luvun alussa on &H. Eli Val("&HFF") on 255. Omankin funktion voi toki laatia:
Function HexDec(luku As String) As Long
Dim merkit As String, i As Integer, tulos As Long
merkit = "0123456789ABCDEF"
For i = 1 To Len(luku)
tulos = 16 * tulos + InStr(merkit, Mid(luku, i, 1)) - 1
Next
HexDec = tulos
End FunctionTässä funktiossa luvun edessä ei ole &H-tunnusta. Eli HexDec(Hex(luku)) on luku.
Jos tarvitsee vielä vähän enemmän vauhtia:
Public Function Hex2Dec(ByRef HexValue As String) As Long
Dim tmpArr() As Byte, tmpUp As Long, A As Long
Dim tmpResult As Long
' virheentarkistus... LenB on nopeampi kuin Len
If LenB(HexValue) = 0 Then Exit Function
' muuta string byte arrayksi
tmpArr = HexValue
' nopeusoptimointia, ei tarvitse UBoundia tarkistaa tuhatta kertaa
tmpUp = UBound(tmpArr)
' vain parilliset tavut ovat oleellisia...
' aloitamme ylimmästä luvusta, string saa olla korkeintaan 8 merkkiä
If tmpUp > 14 Then
' muuta ASCII numeroksi ("0" = 48)
A = tmpUp(14) - 48
' muuta kirjain numeroksi ("A" = 65 - 48 = 17)
If A > 9 Then A = A - 7
' ja sitten vielä muuta tämä luvuksi
tmpResult = A * &H10000000
End If
' tavu 7
If tmpUp > 12 Then
' muuta ASCII numeroksi ("0" = 48)
A = tmpUp(12) - 48
' muuta kirjain numeroksi ("A" = 65 - 48 = 17)
If A > 9 Then A = A - 7
' ja sitten vielä muuta tämä luvuksi
tmpResult = tmpResult Or (A * &H1000000)
End If
' tavu 6
If tmpUp > 10 Then
' muuta ASCII numeroksi ("0" = 48)
A = tmpUp(10) - 48
' muuta kirjain numeroksi ("A" = 65 - 48 = 17)
If A > 9 Then A = A - 7
' ja sitten vielä muuta tämä luvuksi
tmpResult = tmpResult Or (A * &H100000)
End If
' tavu 5
If tmpUp > 8 Then
' muuta ASCII numeroksi ("0" = 48)
A = tmpUp(8) - 48
' muuta kirjain numeroksi ("A" = 65 - 48 = 17)
If A > 9 Then A = A - 7
' ja sitten vielä muuta tämä luvuksi
tmpResult = tmpResult Or (A * &H10000)
End If
' tavu 4
If tmpUp > 6 Then
' muuta ASCII numeroksi ("0" = 48)
A = tmpUp(6) - 48
' muuta kirjain numeroksi ("A" = 65 - 48 = 17)
If A > 9 Then A = A - 7
' ja sitten vielä muuta tämä luvuksi
tmpResult = tmpResult Or (A * &H1000)
End If
' tavu 3
If tmpUp > 4 Then
' muuta ASCII numeroksi ("0" = 48)
A = tmpUp(4) - 48
' muuta kirjain numeroksi ("A" = 65 - 48 = 17)
If A > 9 Then A = A - 7
' ja sitten vielä muuta tämä luvuksi
tmpResult = tmpResult Or (A * &H100)
End If
' tavu 2
If tmpUp > 2 Then
' muuta ASCII numeroksi ("0" = 48)
A = tmpUp(2) - 48
' muuta kirjain numeroksi ("A" = 65 - 48 = 17)
If A > 9 Then A = A - 7
' ja sitten vielä muuta tämä luvuksi
tmpResult = tmpResult Or (A * &H10)
End If
' tavu 1
' muuta ASCII numeroksi ("0" = 48)
A = tmpUp(0) - 48
' muuta kirjain numeroksi ("A" = 65 - 48 = 17)
If A > 9 Then A = A - 7
' ja sitten vielä muuta tämä luvuksi
tmpResult = tmpResult Or A
' palauta arvo
Hex2Dec = tmpResult
End FunctionTästä koodista onkin enemmän hyötyä vasta sitten, kun täytyy pyöritellä enemmän tietoa. Tätäkin nopeamman funktion voi tehdä VB:ssä, mutta se on sitten jo hullua täydellisyyteen pyrkimistä. Ellei tosissaan ole tarvetta käsitellä tolkuton määrä dataa ja pitää se viimeinenkin pitti murskata nopeasti... eri asia vain on sitten se, että miksi silloin ollaan ylipäätään käyttämässä VB:tä, kun pitäisi oikeasti harkita Assembleria :)
Muoks Ai joo, ja sitten vielä huomautus: tämä koodi pääsee oikeuksiinsa vasta kun ohjelman kääntää - IDE:n alla tämä ei ole kamalan nopea
Aihe on jo aika vanha, joten et voi enää vastata siihen.