Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB6: Hex luku normaaliksi luvuksi? (vb)

Cc [13.06.2005 20:11:21]

#

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?

sooda [13.06.2005 20:21:43]

#

Tällain hauskasti voi kikkailla:

kymmenjärjestelmässä = Val("&H" & heksajärjestelmässä)

VB:ssä heksat ilmoitetaan &H-etuliitteellä, ja Val ymmärtää ne.

Antti Laaksonen [13.06.2005 20:23:27]

#

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.

Merri [15.06.2005 00:19:18]

#

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

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta