Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB6: VB ja heksadesimaalit?

TH [10.12.2003 19:58:44]

#

Terve, onko Visual Basicissä olemassa mitään toimintoja joilla voisi muokata tiedoston tietyssä kohdassa olevaa heksadesimaalilukua?
Voisiko joku kirjoittaa esimerkin jossa muutettaisiin esim. tiedoston osoitteessa (vai mikä onkaan) F34C oleva heksa vaikkapa D5:ksi? Olisiko myös keinoa katsoa mikä heksa on tietyssä osoitteessa?
Toivottavasti voitte auttaa, teen ohjelmaa, koska erään asian editointi heksaeditorilla on todella aikaavievää..

Antti Laaksonen [10.12.2003 20:50:21]

#

Seek-komennolla voit siirtyä tiedostossa mihin tahansa kohtaan. Samanniminen funktio myös palauttaa senhetkisen kohdan. Ks. http://vb.ohjelmointiputka.net/?Seek

Tiedoston tavuja voi lukea ja muuttaa Get- ja Put-komennoilla. Luku- ja kirjoituskohdan voi määrittää myös näiden komentojen yhteydessä. Ks. http://vb.ohjelmointiputka.net/?Get ja https://www.ohjelmointiputka.net/hak/?kieli­=Visual Basic&nimi=Put

Desimaaliluvun muuttaminen heksadesimaaliluvuksi tapahtuu Hex-funktiolla. Esimerkiksi Hex(12345) on 3039. Jos heksadesimaaliluvun ilmoittaa itse, sen edessä täytyy olla &H. 12345 on siis &H3039. Heksadesimaaliluvun muuttaminen desimaaliluvuksi taas tapahtuu Val-funktiolla. Esimerkiksi Val("&H3039") on 12345 kuten myös Val("&H" & Hex(12345)).

Seuraavassa esimerkissä luetaan tiedostosta 8. tavu ja näytetään luettu tavu heksadesimaalimuodossa eli 16-järjestelmässä.

'Byte tarkoittaa, että muuttujan koko on yksi tavu
Dim tavu As Byte
'avataan tiedosto binääritilassa
Open "c:\omat\testi.dat" For Binary As #1
'1. tapa: lukukohta ja lukeminen erikseen
Seek #1, 8
Get #1, , tavu
'2. tapa: lukukohta lukemisen yhteydessä
Get #1, 8, tavu
'suljetaan tiedosto
Close #1
'näytetään luettu tavu 16-järjestelmässä
MsgBox Hex(tavu)

TH [10.12.2003 21:13:23]

#

Suurkiitokset! :)

tnb [10.12.2003 21:29:09]

#

Tässä esimerkki ohejmasi ytimeksi:

Private Sub Command1_Click()
Dim osoite As Long
Dim uusidata As Byte
osoite = Any2Dec("00FF", 16) '"F34C"
uusidata = CByte(Any2Dec("D5", 16)) 'on 213 desimaalisena
'Binääri Tiedoston käsittely:
Dim omadata As int32
fil = FreeFile
sfil = "C:\test.txt"
Open sfil For Binary As #fil

Get #fil, osoite, omadata 'luku, 29= monesko tavu
' koska omadata on ulong eli 32 bit niin luettiin 4 tavua
Print CStr(omadata.data1)
Print CStr(omadata.data2)
Print CStr(omadata.data3)
Print CStr(omadata.data4)
Print
omadata.data1 = uusidata
Put #fil, osoite, omadata 'kirjoitus
Print CStr(omadata.data1)
Print CStr(omadata.data2)
Print CStr(omadata.data3)
Print CStr(omadata.data4)
Close #fil
End Sub

'*****************
Ja tämä moduliin
'*****************

Type int32
    data1 As Byte
    data2 As Byte
    data3 As Byte
    data4 As Byte
End Type

'lähde:
'http://www.vb2themax.com/Item.asp?PageID=CodeBank&Cat=110&ID=185

' convert from any base to decimal
' BASE can be in the range 2-36

Function Any2Dec(ByVal otherBaseNumber As String, ByVal base As Integer) As Long
    Dim index As Long
    Dim digits As String
    Dim digitValue As Long

    ' check base
    If base < 2 Or base > 36 Then Err.Raise 5
    ' get the list of valid digits
    digits = Left("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ", base)

    ' convert to decimal
    For index = 1 To Len(otherBaseNumber)
        ' get the digit's value
        digitValue = InStr(1, digits, Mid$(otherBaseNumber, index, 1), _
            vbTextCompare) - 1
        ' error if invalid digit
        If digitValue < 0 Then Err.Raise 5
        ' add to running result
        Any2Dec = Any2Dec * base + digitValue
    Next

End Function

' convert a number to any base
' BASE can be in the range 2-36

Function Dec2Any(ByVal number As Long, ByVal base As Integer) As String
    Dim index As Long
    Dim digits As String
    Dim digitValue As Long

    ' check base
    If base < 2 Or base > 36 Then Err.Raise 5
    ' get the list of valid digits
    digits = Left("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ", base)

    ' convert to the other base
    Do While number
        digitValue = number Mod base
        number = number \ base
        Dec2Any = Mid$(digits, digitValue + 1, 1) & Dec2Any
    Loop

End Function

Vastaus

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

Tietoa sivustosta