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 Function
Tä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 Function
Tä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.