[ vujkev @ 13.11.2008. 15:59 ] @
Pogledajte sledeći kod

Code:

            Dim r As New Regex("\xc6")
            Dim Source As String = "ĆĆĆĆĆĆĆĆĆĆ"    ' <---- kucano kao ALT + 0198
            Dim b(10) As Byte
            For i As Integer = 0 To 10
                b(i) = &HC6
            Next
            Dim source1 As String = System.Text.Encoding.Default.GetString(b)
            Dim mc As MatchCollection = r.Matches(Source)
            Debug.Print(mc.Count.ToString)   ' = 0
            mc = r.Matches(source1)
            Debug.Print(mc.Count.ToString)   ' = 0

            r = New Regex("Ć")    '<--- latinično slovo Ć
            mc = r.Matches(Source)
            Debug.Print(mc.Count.ToString)  ' = 10
            mc = r.Matches(source1)
            Debug.Print(mc.Count.ToString)  ' = 11


dva stringa popunjena sa kodovima &HC6 (latinično Ć). Ukoliko stringove pretražujem sa "\xc6" ne dobijam ni jedno poklapanje, ali ako pretražujem sa slovom "Ć" dobijem odgovarajući broj karaktera

Greška u kodu ili bug u .NET-u?
[ vujkev @ 13.11.2008. 16:26 ] @
Zaboravih da kažem da neke HEX karaktere nalazi, a neke ne. Primera radi ako tražim
Code:

dim r as new regex ("\xD3\xA8\xAF")

ne radi, ali zato
Code:

dim r as new regex ("\xD3\xA8Ž")

radi

&hAF = Ž
[ mmix @ 13.11.2008. 19:01 ] @
\xCC vazi samo za ASCII kodove (do 0x7E), za ostalo je nedefinisano koliko ja znam. &hAF = Ž nije ASCII code.


Mapiranje svih unicode karaktera mozes da postignes koristeci ukucano slovo u regex stringu (npr "\d*Ć") posto su svi stringovi u .NETu unicode a i sam regex u .NETu je unicode, nema potrebe za escape sekvencama
[ vujkev @ 13.11.2008. 20:49 ] @
kako onda radi za D3, A8, A9 i sl. ?

Inače traba da pretražim binarni fajl sa određenim sekvencama npr. D3A8C6, D3A9C6, D3A0E3 i sl.
[ mmix @ 13.11.2008. 21:11 ] @
Iskreno iz glave nemam pojma, u svakom slucaju taj \xCC karakter se nekako encoduje u unicode (verovatno koristeci default snigle-byte character mapiranje za trenutnu kulturu) i onda se radi unicode regex.
Mislim da ti regex u .NETu nije idealno resenje za binarno pretrazivanje bas zato sto forsira rad samo sa stringovima (uostalom i nalazi se u System.Text) i kad ucitas svoj binarni fajl moraces da ga 'naduvas" u string preko necog encodinga sto ce proizvesti charcodove koji nece odgovarati binarno ka single byte u fajlu (tj lupam nece ti naduvati 0xd4 => 0x00d4 nego mozda 0x22f8 i slicno u zavisnosti od encodinga i maping tabele)
[ vujkev @ 13.11.2008. 22:52 ] @
OK, kako onda da pretražim binarne fajlove?

[ mmix @ 13.11.2008. 23:27 ] @
Moraces da napravis svoj matcher, ne verujem da ti framework moze mnogo pomoci ovde. Mozes npr da iskoristis Array.IndexOf da nadjes D3 pa da onda proveris sledeca dva bajtaq za tvoju sekvencu.
[ vujkev @ 14.11.2008. 01:33 ] @
Ja ili ne znam kako se pretražuje array ili ove nešto smrdi

Code:

 Using br As New IO.BinaryReader(New IO.FileStream("C:\Genius\ioCentre\gDevMgm.dll", IO.FileMode.Open, IO.FileAccess.Read, IO.FileShare.Read))
            Dim b(CInt(br.BaseStream.Length) - 1) As Byte
            br.Read(b, 0, CInt(br.BaseStream.Length))
            Debug.Print(Array.IndexOf(b, 198, 0).ToString)     ' --- vrati -1
            Debug.Print(b(1180).ToString)                           ' ---- a na poziciji 1180 se lepo nalazi broj 198 koji sam i tražio :s
        End Using


Kad u regex-u umesto "\xc6" napišem "Ć" pretraga lepo radi, pa me interesuje da li bi to radilo na svim računarima nezavisno od regionalnih podešavanja?

Code:

   Using sr As New IO.StreamReader("C:\Genius\ioCentre\gDevMgm.dll", System.Text.Encoding.Default)

            Dim s As String = sr.ReadToEnd
            Dim rx As New Regex("ŔĆ\x05.*\x53\x6a\x03", RegexOptions.CultureInvariant) 
            Dim m As MatchCollection = rx.Matches(s)
            Debug.Print(m.Count.ToString)
            If m.Count > 0 Then
                Debug.Print(m(0).Index.ToString)
            End If
        End Using
[ mmix @ 14.11.2008. 09:34 ] @
Ne mozes da stavis samo 198 kao parametar za object tip, vb.net kompajler ce ga tretirati kao Int32 bez ikakvog upozorenja i pokusavace da nadje &H000000C6 u nizu bajtova, a posto vb.net nema literal za byte konstantu onda mora neki casting. Probaj neki od sledecih pristupa i radice:

Code:

            Debug.Print(Array.IndexOf(b, CByte(198), 0))
            Debug.Print(Array.IndexOf(Of Byte)(b, 198, 0))


Citat:
Kad u regex-u umesto "\xc6" napišem "Ć" pretraga lepo radi, pa me interesuje da li bi to radilo na svim računarima nezavisno od regionalnih podešavanja?


Pa nece i to je jedan od tvojih problema, kad npr kod mene pokrenem Regex("Ć").Matches dobijam 0 count iako fajl koji sam testirao sadrzi byte &HC6 (sa druge strane kod mene radi \xc6). Jedini razlog zato tebi Ć radi je verovatno zato sto je tvoj sistem nastelovan po nasem regional settingsu (central europe) pa je kod tebe codepage za ANSI tabelu takav da ti je C6 = Ć (Uni: 0x0106). Kod mene (US/Western settings) je C6 = Æ (Uni: 0x00c6) i zato mi recimo radi \xc6 za taj kod (a npr kod mene ne bi radilo \x9c zato sto je kod mene 9C = œ (Uni: 0x0153)). Nema leba od regexa ovde.