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
NextKoodi 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.