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ää..
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)
Suurkiitokset! :)
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 FunctionAihe on jo aika vanha, joten et voi enää vastata siihen.