Avatar billede md_craig Nybegynder
04. april 2005 - 18:17 Der er 14 kommentarer og
1 løsning

Læse og skrive Bit til og fra en fil

Jeg ville lige høre hvordan man kunne skrive til en fil og læse fra en fil helt nede på binært niveau (altså bit)...

Grundet at jeg kunne tænke at lege med lidt fil komprimering bare for at lære noget om det, og fårdi at jeg syntes at nogle af de mest interassante emner inden for programmering er Komprimering, Kryptering og andre former for algoritmer fx inden for Collections sotering og gennemsøgning...

Nå men nok om interesseområde og back til det det handlede om...

Altså hvordan man kunne skrive og læse binært til en fil...
Og desuden meget gerne med mulighed for at få det representeret på binær form... altså 10100100100000101010100101011101011101 osv... (fx ved Console.WriteLine, bare til under udviklingen så man kan følge med i hvad der sker)

Jeps... nogen spørgsmål?
Avatar billede arne_v Ekspert
04. april 2005 - 18:30 #1
Jeg har aldrig set et fil system hvor man kunne skrive bits til - altid
kun bytes.

Derfor skal du lave en buffer.

data--(komprimering)-->virtuelle bits=byte buffer--(skriv)-->disk
Avatar billede arne_v Ekspert
04. april 2005 - 18:33 #2
Hvis du gerne vil konvertere de binære data til en tekst repræsentation stadig
i binær radix, så er det nemt at lave noget kode til det.
Avatar billede arne_v Ekspert
04. april 2005 - 18:38 #3
private static string DIGITS = "0123456789ABCDEF";

    private static string ToAny(int i, int radix)
    {
        string res = "";
        int tmp = i;
        while (tmp > 0) {
            res = DIGITS.ToCharArray()[tmp % radix] + res;
            tmp = tmp / radix;
        }
        return res;
    }

    public static string ToBin(int i)
    {
        return ToAny(i, 2);
    }
Avatar billede md_craig Nybegynder
04. april 2005 - 18:58 #4
Ja du går nok igennem Byte. men det er bare et sprøgsmål om selv at styre hvordan den byte ser ud... uransagligt for om det ellers giver nogen mening...

Men at man fx direkte kan fortælle den at den næste byte skal være "00101101"

og omvendt kunne gå ned og se at hvordan en enkelt byte ser ud... dermed rive "00101101" ud igen... for derved måske at kunne gå ind og måske se om nogle bits er overflødeige i den ene byte og så pakke... (det være med andre bytes i serie)

fx: hvordan jeg så vil "komprimere" det bliver en noget længere snak, pointen er bare om jeg kan kontrolere og styrer/bestemme hvad der står i en Byte...

Og det må være ud fra det første du skrev...

data--(komprimering)-->virtuelle bits=byte buffer--(skriv)-->disk

hvis du bare kan styrer dine virtuelle bits og så bare pakke dem ned i bytes... så er det jo bare det jeg skal :P
Avatar billede md_craig Nybegynder
04. april 2005 - 19:07 #5
Jeg har selv en Converter til at konvertere fra Decimal (long) til Bin, Oct, Hex eller et andet abskurt selvopfundet system... og returnere en string representation... og også den anden vej rundt (abskurt system -> long)
Avatar billede arne_v Ekspert
04. april 2005 - 19:09 #6
Man kan pakke bits ned i bytes med << og |

Og pakke ud med >> og &
Avatar billede md_craig Nybegynder
04. april 2005 - 19:40 #7
Ja øhhh... bøhhh... :P

Tja nu sider jeg så lige og kigger på metoden "Write7BitEncodedInt" i BinaryWriter klassen... og spekulere på om det kan bruges til noget evt...

den må kunne representere fra -127 til 127 i en enkelt byte... 11111111 for -127 og 01111111 for 127 (mener jeg det er)...

Det jeg desvære kan være nervøs for er at man ikke er 100% sikker på at det er den data der bliver skrevet i filen, således at selve de data der skrives måske allivel fylder mere end 1 Byte...

De der Left-Shift, Right-Shift og Logic and/or operator har jeg ikke lige helt styr på brugen af endnu i forhold til Bit og det her...
Avatar billede arne_v Ekspert
04. april 2005 - 19:49 #8
Hvis du vil lave en BitStream så skal du nok igang med at kigge på low level
bit operationer (medmindre du hapser noget kode et sted fra).
Avatar billede md_craig Nybegynder
04. april 2005 - 19:51 #9
Eller givet vil en byte jo også kunne asignes med tal eller hex...

byte dec = 154; (10011010)
byte hex = 0x8c; (10001100)

OG det burde jeg vel et eller andet sted kunne regne med at den så skriver... eller?
Avatar billede arne_v Ekspert
04. april 2005 - 19:55 #10
Du kan sagtens regne med de konstanter.

Men er problem stillingen ikke:
  skriv 3 bits med værdien 2
  skriv 4 bits med værdien 7
  skriv 5 bits med værdien 0
og så få 2 bytes ud af det ?
Avatar billede md_craig Nybegynder
04. april 2005 - 19:59 #11
Okay... ja det er jo nok noget af det jeg skal have fat i... pointen er netop at komme helt der ned når jeg skal komprimere... for måske at kunne undvære nogle bits i en given stream... for så senere at kunne kaste dem ind igen...

Så en 16 bit char måske kan Containes i ned til 6 bit...

00000000 00000001 = fx "a"
000011 = "a" hvor første 5 bit vil kunne fortælle om hvor meget der bliver brugt til at representere den egentlige data...

Det var så bare lige et nok meget ringe eksempel på hvordan... men ideen kan være god nok... man vil givet også kunne fjerne lange serier af nuller og 1 taller i en stream... osv osv... men for at kunne noget af dette skal jeg jo styrer denne bitstrøm... og hvor tåbeligt og dårligt komprimeringen så bliver til at starte med er ligemeget... Det er trods alt kun for at lære noget... og komme i gang... Skide være med at en text fil med måske 5 tegn der normalt fylder 5 byte's kommer til at fylde 10 bytes... (til at state med naturligvis) :P
Avatar billede md_craig Nybegynder
04. april 2005 - 20:02 #12
Ikke hvis jeg er sikker på at hvis jeg ber en BinaryWriter om at skrive en byte defineret ved 0x8c som svare til 10001100 med Write metoden... at det så også er de bits der definere lige denne byte den skriver...

I såfald vil jeg tror jeg nok selv vil kunne styre hvordan 3 tegn eksempelvis kan pakkes ned i 2 bytes...
Avatar billede md_craig Nybegynder
04. april 2005 - 20:34 #13
Jamen det ser det sørme også ud til... Det jo en dejlig ting...

Så er det jo ellers bare at komme i gang... Skal nok blive sjovt nok et eller andet sted... Indtil videre vil jeg sige tak for hjælpen... eller noget... :P
Avatar billede md_craig Nybegynder
26. maj 2005 - 15:32 #14
svar... evt... Ryde op tid hvertfald...
Avatar billede arne_v Ekspert
26. maj 2005 - 15:34 #15
ok
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