[ daki88 @ 10.12.2010. 19:02 ] @
Da li neko zna jel postoji neka klasa koja omogućava rad sa bitovima u C#-u? Radim Shannon Fano kompresiju i treba da binarni kod koji dobijem snimim u datoteku. Ukoliko bi snimao kao tip integer ili kao string dobijena datoteka bi bila veća od ulazne što nije dobro. Čak i kad bi vršio konverziju binarnog koda u HEX-a opet bi datoteka bila veća. Neka ideja, bilo šta?
[ Shadowed @ 10.12.2010. 20:25 ] @
U kojem obliku ti se nalaze ti bitovi pre nego hoces da ih snimis u fajl?
[ daki88 @ 10.12.2010. 20:33 ] @
Svi bitovi su snimljeni u jedan string, mada nije nikakav problem da ih konvertujem nekako, samo nemam ideju kako i u šta... Datoteka može da bude bilo kog tipa
[ Shadowed @ 10.12.2010. 20:40 ] @
Pa, iseckaj onda na po 8 karaktera i konvertuj svaki takav deo u po jedan bajt a onda to upisuj. Onda ces imati preslikane bitove iz stringa u one da disku tj. jedan bit ce upravo i zauzimati jedan bit memorije na hdd-u.
[ daki88 @ 11.12.2010. 16:40 ] @
Iseckam ga i pamtim svaki bajt pocebno, međutim, on svaki kod, tj svaku 0 ili 1 prepoznaje kao 1 bajt. Evo deo koda koji vrši upis, ekstenzija datoteke je txt ali i kad je stavim *.dat ponaše se potpuno isto i moguće je otvoriti u notepad-u.

Code:

using (FileStream stream = new FileStream("C:\\datoteka.txt", FileMode.Create))
{
    using (BinaryWriter writer = new BinaryWriter(stream))
    {
        byte[] bajt;
        bajt = encoding.GetBytes(osambita); // osambita - string koji sadrži 8 nula i jedinica
        writer.Write(bajt);
        writer.Close();
    }
    stream.Close();
}
[ Boško @ 11.12.2010. 17:07 ] @
Ako hoćeš bajt da upišeš kao niz bitova onda ga upisuj kao string (nemoj da koristiš BinaryWriter).

Code:

string bajt;
bajt = osambita;
//...

A ako hoćeš da upisuješ bit po bit onda promenljivu postavi kao bit i ne deli ulazni string na po osam karaktera već na po jedan.

[ Shadowed @ 11.12.2010. 17:59 ] @
Moras prvo obraditi svaki string.
Npr, ako imas "10010101" moras pregledati svaku poziciju i izracunati broj. Onda taj broj smestis u promenljivu tipa Byte.
[ daki88 @ 13.12.2010. 16:52 ] @
Uspeo sam da odradim, evo koda, možda nekom potreba. Hvala na saradnji
Code:

if (kod[i] == '0')
{
    bc++;
    buffer = (byte)(buffer << 1);
    if (bc == 8)
    {
        stream.WriteByte(buffer);
        buffer = 0;
        bc = 0;
    }
}
if (kod[i] == '1')
{
    bc++;
    buffer = (byte)(buffer << 1);
    buffer = (byte)(buffer | 0x01);
    if (bc == 8)
    {
        stream.WriteByte(buffer);
        buffer = 0;
        bc = 0;
    }
}