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 Function
Aihe on jo aika vanha, joten et voi enää vastata siihen.