Avatar billede Slettet bruger
27. juli 2005 - 17:49 Der er 11 kommentarer og
1 løsning

Binary files

Kan det lade sig gøre at slette midt i en binær fil uden at lade en tom plads være tilbage hvor man har slettet?

Eks på fil indhold:

12345abcdef123456123456789012345612345abcdef123456123456789012345612345abcdef123456123456789012345612345abcdef123456123456789012345612345abcdef1234561234567890123456

Denne streng består af 5 af disse: 12345abcdef1234561234567890123456

Og den bliver delt på på følgende måde:

12345 abcdef 123456 1234567890123456

Hvis vi nu forestiller os at det er unikke strenge: 12345abcdef1234561234567890123456 der står efter hinanden, og jeg gerne vil fjerne en af dem, fra filen - Hvordan gør jeg så det?
Avatar billede arne_v Ekspert
27. juli 2005 - 18:07 #1
det kan ikke lade sig gøre
Avatar billede arne_v Ekspert
27. juli 2005 - 18:08 #2
(hvis dine strenge fylder præcis det der svarer til en fysisk allokerings enhed
på disk og du hacker fil systemer, så kan det måske lade sig gøre, men det er
ikke relevant for det fleste)
Avatar billede Slettet bruger
27. juli 2005 - 21:16 #3
Kan jeg så erstatte det med eks 0x00'er? alle der steder hvor 12345(de første 5) fremstår.

Så man erstatter 12345abcdef1234561234567890123456 med X antal 0x00
Avatar billede arne_v Ekspert
27. juli 2005 - 21:18 #4
sagtens

du løber filen igennem og overskriver de tegn du vil af med med nul bytes
Avatar billede Slettet bruger
27. juli 2005 - 21:26 #5
Eks :o)
Avatar billede arne_v Ekspert
27. juli 2005 - 21:29 #6
giv mig lige 10 minutter
Avatar billede Slettet bruger
27. juli 2005 - 21:31 #7
Du kan få den tid det kræver mester :o) Jeg er lidt i stadiet hvor jeg overvejer at smide det i PDA'en SQL database, og så håndtere dataen der. Men jeg vil meget gerne lige se hvordan det gøres i Binary, få det er at foretrække :o)
Avatar billede arne_v Ekspert
27. juli 2005 - 21:37 #8
her er et eksempel som erstatter bb med __:

using System;
using System.IO;

class MainClass
{
    public static void Main(string[] args)
    {
        FileStream fs = new FileStream(@"C:\bin.dat", FileMode.Open, FileAccess.ReadWrite);
        for(int i = 0; i < fs.Length - 1; i++)
        {
            byte[] b = new byte[2];
            fs.Seek(i, SeekOrigin.Begin);
            fs.Read(b, 0, b.Length);
            if(b[0] == 'b' && b[1] == 'b')
            {
                b[0] = (byte)'_';
                b[1] = (byte)'_';
                fs.Seek(i, SeekOrigin.Begin);
                fs.Write(b, 0, b.Length);
            }
        }
        fs.Close();
    }
}
Avatar billede arne_v Ekspert
27. juli 2005 - 21:38 #9
bemærk at performance er meget dårlig i det eksempel

hvis performance skal være bedre så skal der bufferes

men det er simpelt at læse og forstå
Avatar billede Slettet bruger
27. juli 2005 - 21:49 #10
Ok tak, jeg ser på det bare smid et svar :o)
Avatar billede arne_v Ekspert
27. juli 2005 - 21:51 #11
svar
Avatar billede arne_v Ekspert
27. juli 2005 - 21:51 #12
Det tog 5-10 minutter at løbe en 20 MB fil igennem hos mig så til store
filer skal der laves noget buffering.
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