Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Parsovanje binarnog fajla u C#

[es] :: .NET :: .NET Desktop razvoj :: Parsovanje binarnog fajla u C#

[ Pregleda: 2810 | Odgovora: 10 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Voodoo
Novi Beograd

Član broj: 3508
Poruke: 488
*.ptt.yu.



+1 Profil

icon Parsovanje binarnog fajla u C#07.03.2007. u 19:39 - pre 179 meseci
Treba da nađem određenu sekvencu bajtova u fajlu (konkretno, MP3 header: FF Fx gde je x bilo šta). Međutim procedura puca u svim situacijama osim kad je header na početku fajla. Gde grešim? Još sam relativno nov u C#, a ovaj način funkcioniše u drugim jezicima...

Code:
            byte[] blok = new byte[2];
            int x = 0;

            FileStream s = File.OpenRead(@"c:\neki\fajl.mp3");
            while (x < s.Length)
            {                
                s.Read(blok, x, 2);
                if ((blok[0] == 255) && ((blok[1] & 240) == 240))
                {
                    Console.WriteLine("MP3 header found at {0}", x);
                    break;
                }
                x++;
            }
            s.Close();
 
Odgovor na temu

IDeveloper
Beograd

Član broj: 136606
Poruke: 25
*.informatika.com.



Profil

icon Re: Parsovanje binarnog fajla u C#08.03.2007. u 08:43 - pre 179 meseci
Problem je u tome sto si stavio da ti offset = x, a treba da bude nula

primer:
Code:

byte[] blok = new byte[2];
           int x = 0;
           FileStream s = File.OpenRead(@"D:\Muzika\Eros Ramazzotti - Questo Immenso Show.mp3");

           while (x<s.Length)
           {
               s.Read(blok, 0, 2); //Ovde je nula a ne x
               if ((blok[0] == 255) && ((blok[1] & 240) == 240))
               {
                   //Radim na formi pa zato upisujem text u labelu
                   labelControl1.Text = "MP3 header found at " + x.ToString();
                   break;
               }
               x++;
           }
           s.Close();

Pozdrav!

[Ovu poruku je menjao mmwc dana 15.03.2007. u 09:19 GMT+1]
 
Odgovor na temu

Voodoo
Novi Beograd

Član broj: 3508
Poruke: 488
*.ptt.yu.



+1 Profil

icon Re: Parsovanje binarnog fajla u C#08.03.2007. u 09:15 - pre 179 meseci
Upravo sam malopre to provalio čitajući MSDN... mislio sam da je u pitanju offset u fajlu, a u stvari radi se o ofsetu u odredišnom bloku bajtova. Ako ništa, bar ne moram da održavam svoj pokazivač na lokaciju :)
Hvala na trudu u svakom slučaju ;)

Code:
            byte[] blok = new byte[2];

            FileStream s = File.OpenRead(@"c:\neki\nebitan\fajl.mp3");
            try {
                while (true)
                {
                    s.Read(blok, 0, 2);
                    s.Position -= 1;
                    if ((blok[0] == 255) && ((blok[1] & 240) == 240))
                    {
                        Console.WriteLine("MP3 header found at {0}", s.Position - 1);
                        throw new EndOfStreamException();
                    }                    
                }
            }
            catch
            {
                s.Close();
            }
 
Odgovor na temu

IDeveloper
Beograd

Član broj: 136606
Poruke: 25
*.informatika.com.



Profil

icon Re: Parsovanje binarnog fajla u C#08.03.2007. u 09:58 - pre 179 meseci
Nema na cemu! :)
Samo bi ti preporucio (posto si pocetnik u C#) da try catch blok ne koristis kada nema potrebe (kao u ovom slucaju) tj. kada je sve predvidivo! Jako je koristan, ali kosta resursa!
Ovo ti pricam zato sto ti ono glavno nije u try bloku a to je FileStream. Najcesce ce ti takve stvari praviti probleme (mozda fajl ne postoji, nije dostupan ako je negde na mrezi i sl.) Sledeci kod ima neku svrhu:

Code:

 byte[] blok = new byte[2];

           try
           {
               FileStream s = File.OpenRead(@"c:\neki\nebitan\fajl.mp3");
               while (true)
               {
                   s.Read(blok, 0, 2);
                   s.Position -= 1;
                   if ((blok[0] == 255) && ((blok[1] & 240) == 240))
                   {
                       Console.WriteLine("MP3 header found at {0}", s.Position - 1);
                       break;
                   }
               }
               s.Close();
           }
           catch (Exception e)
           {
               // Ovde stavis neku rutinu za obradu greske
               //Console.WriteLine(e);
           }

U drugom slucaju ispravno napisana petlja bolje radi.
Mozda je ovo glup primer za pricu na koju ja mislim (suvise je mali program)!
Ovo je samo savet! Pozdrav!!! :)

[Ovu poruku je menjao mmwc dana 15.03.2007. u 09:20 GMT+1]
 
Odgovor na temu

negyxo
Aleksandar Perkuchin

Član broj: 29751
Poruke: 898
*.sksyu.net.



+171 Profil

icon Re: Parsovanje binarnog fajla u C#08.03.2007. u 10:36 - pre 179 meseci
@IDeveloper
Sta ako ti pukne negde u sredini bloka kod?

Za ovakve stvari najbolje koristite using direktivu.
 
Odgovor na temu

IDeveloper
Beograd

Član broj: 136606
Poruke: 25
*.informatika.com.



Profil

icon Re: Parsovanje binarnog fajla u C#08.03.2007. u 10:47 - pre 179 meseci
Da ne idemo sada na drugu stranu, tj. da ne pocinjemo diskusiju o metodima sa nekoliko stotina ili hiljada redova koda!! Samo sam dao savet coveku da bi ,po mome misljenju, trebalo voditi racuna o koriscenju try catch bloka(rekao sam, jako korisno, ali kosta resursa)!
Pozdrav!!!

[Ovu poruku je menjao mmwc dana 15.03.2007. u 09:21 GMT+1]
 
Odgovor na temu

negyxo
Aleksandar Perkuchin

Član broj: 29751
Poruke: 898
*.sksyu.net.



+171 Profil

icon Re: Parsovanje binarnog fajla u C#08.03.2007. u 11:40 - pre 179 meseci
Stvarno, da ne idemo u diskusiju
Nemoj da se ljutis, reagovao sam na implementaciju try-catch bloka koju si dao, ne na tvoj savet. Mislio sam da ce biti korisno to istaci, ali u svakom slucaju saznali bi to kad-tad u debugeru
 
Odgovor na temu

IDeveloper
Beograd

Član broj: 136606
Poruke: 25
*.informatika.com.



Profil

icon Re: Parsovanje binarnog fajla u C#08.03.2007. u 12:06 - pre 179 meseci
@negyxo
Daleko od toga da se ljutim. Samo ne volim diskusije o stilovima programiranja....
Programiranje i stilovi programiranja su, po meni, stvar licnog afinitena! Vise volim da resavam probleme nogo da diskutujem! :)

POZDRAV!!!

[Ovu poruku je menjao mmwc dana 15.03.2007. u 09:23 GMT+1]
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6023



+4621 Profil

icon Re: Parsovanje binarnog fajla u C#08.03.2007. u 15:00 - pre 179 meseci
Da presecem ja ovde, @everybody.

a) try/catch ne kosta nista dok ne dodje do exception-a. A kad dodje do exception-a, ili ces ga ti uhvatiti ili ce prvi raspolozivi catch u stek-u, u oba slucaja kostace otrilike isto. Sama cena try-a i cleanup-a kad se ne desi exception je neznatna.

b) U ovom slucaju nije sve predvidivo, probaj da kroz ove rutine propustis fajl od 0 bajta pa da vidis kako prsti ArgumentOutOfRangeException na s.Position -= 1;

c) Prica o tome kako su exception-i zli je tacna, ali se to ne odnosi na koriscenje try/catch vec se odnosi na preporuku da ne bacas svoje exception-e za svaku glupost i kad god je moguce ne koristis exception kao metod komunikacije sa pozivnom metodom (sto nije uvek moguce i treba koristiti exception-e, naoricto ako ce neoko drugi da poziva tvoje metode).

c1) Ono sto treba da se radi u try/catch a niko ne radi je da se ne hvata genericki Exception vec specificni exception koji umes da procesiras, ostale treba pustiti da prodju. Najveca greska koju programeri prave je da ne zele da pisu sto linija koda i onda nespretno 'progutaju' neki ozbiljan exception koji je mogao da se resi negde 'uzvodno' ili je namenski trebalo da obori ceo proces. Ili naprave metod koji vraca true/false kao indikator uspeha i onda progutaju genericki exception i vrate false kroz catch, pa se ti posle cesi zasto si dobio false..

d) Da, File.OpenRead mora u try

e) ovo je zaista dobro mesto za using, samo imaj u vidu da je using nista drugo nego kontrola kreiranje/unistavanja objekta kroz try/finally strukturu, ako je cilj izbeci try onda using nije resenje.

e) Kod ima bug, bafer se ne cisti i ako fajl ima neparnu velicinu i zavrsava sekvencom XX FX FF gde je X random, naci ce match (FF ce prebrisati FX a FF ce ostati i dobices FF FF u bloku i imaces lazan match)

f) generalno, ovakav nacin pretrazivanja fajlova je neoptimizovan . Svaki bajt se ucitava 2 puta i za fajl od X bajtova pravi se [X/2]*2 poziva u I/O (sto kosta mnogo mnogo vise od try/catch sa sve preemptive reading i kesiranjem od strane OSa). Gledaj da falove ucitavas u vecim blokovima (npr 32k) i da onda pretrazujes unutar bloka

Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

vladdy
Chicago, USA

Član broj: 30119
Poruke: 137
*.dsl.emhril.ameritech.net.

Sajt: www.pro-transport.com


Profil

icon Re: Parsovanje binarnog fajla u C#08.03.2007. u 17:24 - pre 179 meseci
O ovome oko try/catch overhead-a se moze diskutovati. Cak i Microsoft-ova dokumentacija je tu nejasna, oni koriste termin "virtually nothing" :)) dok Nick Wienholt u knjizi "Maximising .NET Performance" pominje i do 20% penalty ako se ne varam, naravno kod nekih kompleksnijih operacija.

Znam da su zakrvili oko toga na msdn newsgroup-u, kao da je toliko bitno :))

Uglavnom overhead postoji, za vecinu jeste neznatan ali postoji cak i ako ne dodje do exception-a.

Oko ovoga se totalno slazem:

Citat:
Ono sto treba da se radi u try/catch a niko ne radi je da se ne hvata genericki Exception vec specificni exception koji umes da procesiras, ostale treba pustiti da prodju. Najveca greska koju programeri prave je da ne zele da pisu sto linija koda i onda nespretno 'progutaju' neki ozbiljan exception koji je mogao da se resi negde 'uzvodno' ili je namenski trebalo da obori ceo proces. Ili naprave metod koji vraca true/false kao indikator uspeha i onda progutaju genericki exception i vrate false kroz catch, pa se ti posle cesi zasto si dobio false..


To jeste greska kod vecine ali vremenom ljudi sazru i nauce kako da koriste Try/Catch koji je mac sa dvije ostrice. Nesto slicno "edit & continue" debug-u :)).

Za te neocekivane greske, ukljucujuci generic Exception, i postoji Global Exception Handler da ih "hvata" kroz kompletan program, procesira (upise u log, posalje na web service ...) ili ispise korisniku.
http://www.pro-transport.com - The most advanced trucking software on the market
 
Odgovor na temu

negyxo
Aleksandar Perkuchin

Član broj: 29751
Poruke: 898
*.sksyu.net.



+171 Profil

icon Re: Parsovanje binarnog fajla u C#08.03.2007. u 18:51 - pre 179 meseci
Citat:

e) ovo je zaista dobro mesto za using, samo imaj u vidu da je using nista drugo nego kontrola kreiranje/unistavanja objekta kroz try/finally strukturu, ako je cilj izbeci try onda using nije resenje.


Sve stoji, nisam hteo da postujem kod ali evo

Code:

            using (ResourceType resource = expression) statement
            try 
            {
                statement; 
            }
            finally 
            { 
                if (resource != null) ((IDisposable)resource).Dispose();
            } 


Ovo je za reference tipove, dok je za value tipove bez onoga if u finally.

Citat:

c) Prica o tome kako su exception-i zli je tacna, ali se to ne odnosi na koriscenje try/catch vec se odnosi na preporuku da ne bacas svoje exception-e za svaku glupost i kad god je moguce ne koristis exception kao metod komunikacije sa pozivnom metodom (sto nije uvek moguce i treba koristiti exception-e, naoricto ako ce neoko drugi da poziva tvoje metode).


Drago mi je da si ti ovo rekao Meni je glupost da bi se izbegao try & catch blok koristiti neke 'predvidive situacije' i to iz dva razloga. Prvi je enkapsulacija a drugi je performance penalty koji ce najverovatnije biti jos veci nego sa try-catch. Naravno postoje i situacije, gde treba koristiti tu predvidivost, recimo petlja sa nekom racunicom, koja moze da baci division by zero exception.
 
Odgovor na temu

[es] :: .NET :: .NET Desktop razvoj :: Parsovanje binarnog fajla u C#

[ Pregleda: 2810 | Odgovora: 10 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.