Avatar billede mr-kill Nybegynder
20. marts 2006 - 22:33 Der er 13 kommentarer og
1 løsning

Læs hex fra fil

Jeg sidder og leger med et program der skal kunne åbne en fil og vise alle bytes i hex format. Problemet er at den er alt for lang tid om at åbne en fil. Når jeg prøver at åbne en fil på 610 kb tager det ca. 5 min at indlæse den. Jeg tror det er min kode der er for langsom, men kan ikke lige se hvad jeg kan gøre, for at gøre den bedre.

Håber der er nogen der har et bud :)


Koden kommer her:
--------------------
string fil = textBox1.Text;
textBox1.Text = "";
string samler = "";

int antal_bytes = 1024 * 100;
byte[] læser = new byte[antal_bytes];
FileStream f = new FileStream(fil, FileMode.Open, FileAccess.Read);
BinaryReader br = new BinaryReader(f);

if (f.Length >= antal_bytes)
{
    for (int i = 0; i < (int)f.Length / antal_bytes; i++)
    {
        læser = br.ReadBytes(antal_bytes);

        for (int j = 0; j < læser.Length; j++)
        {
            if ((j % 2 == 0 && j != 0))
                samler += " ";
           
            samler += læser[j].ToString("X2");
        }

        textBox1.Text += samler + " ";
        samler = "";
    }
    int rest = (int)f.Length % antal_bytes;
    if (rest != 0)
    {
        byte[] resten = br.ReadBytes(rest);
        for (int j = 0; j < rest; j++)
        {
            if ((j % 2 == 0 && j != 0))
                samler += " ";

            samler += resten[j].ToString("X2");
        }

        textBox1.Text += samler + " ";
        samler = "";
    }
}
else
{
    byte[] resten = br.ReadBytes((int)f.Length);
    for (int j = 0; j < f.Length; j++)
    {
        if ((j % 2 == 0 && j != 0))
            samler += " ";

        samler += resten[j].ToString("X2");
    }

    textBox1.Text += samler + " ";
    samler = "";
}

br.Close();
f.Close();
Avatar billede arne_v Ekspert
20. marts 2006 - 22:36 #1
proev og lad din samler variabel vaere en StringBuilder fremfor en String !
Avatar billede arne_v Ekspert
20. marts 2006 - 22:37 #2
(den er i System.Text)
Avatar billede mr-kill Nybegynder
20. marts 2006 - 22:40 #3
Jeg har ikke lige prøvet at bruge StringBuilder før. Du har vel ikke lige et lille eksempel på hvordan det forgår?
Avatar billede arne_v Ekspert
20. marts 2006 - 22:45 #4
public static string newPassword(int l)
    {
        char[] valid = { 'A', 'B', 'C', '2', '3', '4' };
        StringBuilder sb = new StringBuilder("");
        for(int i = 0; i < l; i++)
        {
            sb.Append(valid[rng.Next(valid.Length)]);
        }
        return sb.ToString();
    }
Avatar billede arne_v Ekspert
20. marts 2006 - 22:47 #5
StringBuilder samler = new StringBuilder("");
...
samler.Append(læser[j].ToString("X2"));
...
samler.Append(resten[j].ToString("X2"));
...
textBox1.Text += samler.ToString() + " ";
Avatar billede mr-kill Nybegynder
20. marts 2006 - 22:51 #6
hmmm det tager stadig lang tid, den linie den bruger meget tid på er
textBox1.Text += samler.ToString() + " ";
Avatar billede arne_v Ekspert
20. marts 2006 - 22:58 #7
StringBuilder samler = new StringBuilder(textBox1.Text);
...
samler.Append(" ");
textBox1.Text = samler.ToString();
Avatar billede mr-kill Nybegynder
20. marts 2006 - 23:09 #8
Hmmm Det har hjulpet lidt, men ikke meget. Hvad gør jeg galt?

Jeg har nu denne kode:
-------------
string fil = textBox1.Text;
textBox1.Text = "";
StringBuilder samler = new StringBuilder(textBox1.Text);

int antal_bytes = 1024 * 100;
byte[] læser = new byte[antal_bytes];
FileStream f = new FileStream(fil, FileMode.Open, FileAccess.Read);
BinaryReader br = new BinaryReader(f);

if (f.Length >= antal_bytes)
{
    for (int i = 0; i < (int)f.Length / antal_bytes; i++)
    {
        læser = br.ReadBytes(antal_bytes);

        for (int j = 0; j < læser.Length; j++)
        {
            if ((j % 2 == 0 && j != 0))
                samler.Append(" ");
           
            samler.Append(læser[j].ToString("X2"));
        }
        samler.Append(" ");
        textBox1.Text = samler.ToString();
        samler = new StringBuilder(textBox1.Text);
    }
    int rest = (int)f.Length % antal_bytes;
    if (rest != 0)
    {
        byte[] resten = br.ReadBytes(rest);
        for (int j = 0; j < rest; j++)
        {
            if ((j % 2 == 0 && j != 0))
                samler.Append(" ");

            samler.Append(resten[j].ToString("X2"));
        }

        samler.Append(" ");
        textBox1.Text = samler.ToString();
        samler = new StringBuilder(textBox1.Text);
    }
}
else
{
    byte[] resten = br.ReadBytes((int)f.Length);
    for (int j = 0; j < f.Length; j++)
    {
        if ((j % 2 == 0 && j != 0))
            samler.Append(" ");

        samler.Append(resten[j].ToString("X2"));
    }

    samler.Append(" ");
    textBox1.Text = samler.ToString();
    samler = new StringBuilder(textBox1.Text);
}

br.Close();
f.Close();
Avatar billede arne_v Ekspert
21. marts 2006 - 01:50 #9
prøv og flyt

        textBox1.Text = samler.ToString();

ud af if/for og helt ned forneden

og så kan

        samler = new StringBuilder(textBox1.Text);

nok helt undværes
Avatar billede mr-kill Nybegynder
21. marts 2006 - 07:57 #10
Hvad sker der så hvis jeg prøver at læse en fil der er større end det der kan være i RAM'en?
Avatar billede arne_v Ekspert
21. marts 2006 - 13:26 #11
enten får du en exception eller hvis du har pagefil plads det går ufatteligt langsomt
Avatar billede mr-kill Nybegynder
21. marts 2006 - 14:59 #12
Hmmm okey.. Det går da hurtige nu, men jeg havde regnet med at det ville kunne gøre endnu hurtige...

Smid et svar, så får du nogle point arne ;)
Avatar billede arne_v Ekspert
21. marts 2006 - 16:30 #13
det vil nok under alle omstaendigheder tage tid at lave saa stor en GUI control

har du overvejet at lave noget paging ?

vis foerste 10 KB, page ned viser saa naeste 10 KB etc.

og svar
Avatar billede mr-kill Nybegynder
21. marts 2006 - 16:32 #14
Kunne jeg self. gøre :)

Tak for hjælpen...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester