Olisi kiva jos joku osaavampi voisi tehdä relatiivinen haku -koodivinkin tänne Ohjelmointiputkaan, kun en Googlella löytänyt sellaista enkä osannut itse ohjelmoida. :/ ROM-muokkaajat varmaan tietävätkin termin, itse en osaa sitä selittää :(
Voitko hieman kertoa tuosta? Tuli uutena asiana ja tekis mieli saada vähän täytettä tohon kohtaan tietovarastoa. :)
No, sinulla on merkkijono ja tiedosto. Tiedät, että merkkijono (esim. "kissa") löytyy tiedoston sisältä, mutta tiedosto käyttää jotain outoa enkoodausta. Kuitenkin tiedät että aakkoset menevät enkoodauksessa järjestyksessä, eli a,b,c,d,e...etc. Sitten sinä haluat keksiä, onko A-kirjain enkoodauksessa 64 (niinku ASCII-muodossa) vai 28 (niinku se vois olla jossain muussa muodossa) ja sitten ne aakkoset tulee siihen perään. Niin, eli sitten annettua merkkijonon ASCII-arvoja shiftataan ja tutkitaan että millä shiftauksella ja missä se merkkijono tulee vastaan. Eli esim. "kissa" shiftattuna 4 kertaa "eteenpäin" olis "omwwe". Tälläinen toiminto löytyy joistakin hexa-editoreista. Ikävä kyllä ne ovat vain suljettua lähdekoodia :) Kysy toki lisää, jos ei tullut selväksi!
Ratkaisu on tutkia, kuinka paljon yhteen merkkiin pitää lisätä tai vähentää, jotta päästään seuraavaan merkkiin. Esimerkiksi merkkijonosta "kissa" havaitaan, että muutokset ovat -2, 10, 0 ja -18. Siis k:sta pääsee i:hin, kun menee kaksi askelta alas, i:stä pääsee s:ään, kun menee kymmenen askelta ylös jne. Nyt pitää enää käydä läpi koko tiedosto ja laskea sen kaikista peräkkäisistä merkeistä vastaavat muutokset. Tässä tapauksessa siis kaikista muutoksista haettaisiin sarjaa -2, 10, 0 ja -18.
Hyvä Antti, osasit sanoa sen paremmin kuin minä! Mutta voisiko joku tehdä koodivinkin aiheesta?
Tässä tulee esimerkkikoodi Visual Basicille:
Dim teksti As String, sana As String Dim i As Integer, j As Integer Dim sama As Boolean ' tutkittava teksti teksti = "qywxeromwwerteowyxtswoix" ' etsittävä sana sana = "kissa" ' tarkastetaan kaikki aloituskohdat For i = 1 To Len(teksti) - 1 ' oletetaan, että sana löytyy sama = True ' tarkastetaan kaikki muutokset For j = 1 To Len(sana) - 1 ' jos muutos ei ole sama, kohta ei kelpaa If Asc(Mid(teksti, i + j, 1)) - Asc(Mid(teksti, i + j - 1, 1)) <> _ Asc(Mid(sana, j + 1, 1)) - Asc(Mid(sana, j, 1)) Then sama = False Exit For End If Next ' jos kaikki muutokset olivat samoja, sana löytyi If sama Then MsgBox "Sana löytyi kohdasta " & i & ": " & Mid(teksti, i, Len(sana)) End If Next
Koodi käy läpi tekstin jokaisen merkin ja tutkii, alkaako etsittävä sana siitä kohdasta. Jos kaikki muutokset ovat samoja tutkittavassa tekstissä ja etsittävässä sanassa, kun on valittu tietty aloituskohta, voidaan ilmoittaa käyttäjälle, että sana löytyi siitä kohdasta tekstiä. Tämä ei ole tehokkain mahdollinen ratkaisu, mutta luultavasti riittävän tehokas tarkoitukseesi.
Aihe on jo aika vanha, joten et voi enää vastata siihen.