Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 8 odgovora
  • 3.353 pregleda

Najnovija ↓

Citanje i pisanje u bin file 29.04.2010. u 15:40 · pre 201 mesec #1
Kako u c# da upisem string "0011001011011001110011000001111100111010101010111110001100" u binarni file?
A kako da posle iscitam taj file i da opet dobijem string od 0 i 1?

hvala unapred
Re: Citanje i pisanje u bin file 01.05.2010. u 21:45 · pre 200 meseci #5
Tvoj binarni niz ima 58 bita a fajlovi na disku su byte-sized, sto znaci da u fajl moras da zapises x*8 bitova, u tvom slucaju minimalni broj bita je 64 (8 bajtova). Sad se postavlja pitanje cime paddujes tih preostalih 6 bita (sa 0 ili 1) i da li paddujes sa pocetka ili kraja, a to niko ne mozes da znas ako ne znas sta su ti bitovi.
Potpis
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ć
Re: Citanje i pisanje u bin file 01.05.2010. u 22:53 · pre 200 meseci #6
Može prvo da upiše broj bita koje pretvara u bajte. Broj je 58 i ako ne prelazi 255 onda može da upiše kao bajt. Onda doda nule do deljivosti sa 8 pa ih pretvari u bajte. Kada čita, pročita okrugao broj bajta, pretvori ih u bite, pa od bita oduzme višak i dobije početnih 58 od kojih je krenuo.
Re: Citanje i pisanje u bin file 02.05.2010. u 01:22 · pre 200 meseci #7
Sve od pomenutih predloga podrazumeva neki algoritam, mehanizam, kako
obraditi taj string pre upisa u fajl, kao i obratno,nakon chitanja iz
fajla, proces pretvaranja ponovo u taj string.

Moj predlog je da taj binarni string pretvorish u dekadni broj. A
struktura bin fajla da ti bude takva da na prvom mestu stoji podatak
koliko ima bitova u tom stringu koji se zapisuje, a nakon njega da se
upishe dekadni broj (u koji si pretvorio niz bitova iz stringa). E sad,
ako broj bitova prevazilazi broj bitova koji se mogu realizovati tipom
podatka koji odaberesh, (recimo, u Int32 moze da stane 32 bita), onda cesh
nakon upisa broja bitova, u fajl upisati vishe Int32 podataka). Isto
tako, taj tip moze da bude promenljiv. Ako si prochitao da broj bitova ne
prelazi 255, onda upishi byte, i to chitaj iz fajla da ne bi zauzimao
puno vishe bitova nego shto je potrebno.
Na ovaj nachin, najveci deo posla su dve f-je za konverziju iz stringa 0 i
1 u dekadni broj, i obrnuto.

--
Using Opera's revolutionary e-mail client: http://www.opera.com/mail/
Re: Citanje i pisanje u bin file 02.05.2010. u 12:41 · pre 200 meseci #8
Ovih 58 bita sam dao kao primer, radi se o mnogo vecem nizu.

bas sam tu i zaglavio, ne znam kako da resim dodavanje recimo nula na kraju da napunim ceo bajt.

pokusacu sa ovim vasim predlogom da prvi bajt u fajlu bude vrednost dodatih nula u poslednjem bajtu niza.

hvala na predlogu
Re: Citanje i pisanje u bin file 02.05.2010. u 18:05 · pre 200 meseci #9
Najprostije je da svaki oktet od osam bitova zapisujes kao bajt, sto ti daje najvece moguce pakovanje, naravno bez eksterne kompresije. Npr. "11111111" ces zapisati kao 255, i sl.

Problem treba resiti samo za zadnji oktet binarnog stringa ako nema osam bitova. Pretopstavljam da je bitan broj i nula i jedinica u zadnjem oktetu i da ne mozes da dodajes nule na pocetak ili kraj da dopunis do 8, bez da se izgubi znacenje stringa. Zato predlazem da ti zadnji bajt u fajlu samo kaze koliko ima znacajnih cifara zadnjem oktetu.

Naivna implementacija koja radi bi bila ovako nesto:

Code:

public byte[] ToByteArray(string binaryString)
{
    var len = binaryString.Length;
    var buff = new byte[(len + 7)/8 + 1];
    var buffCnt = 0;
    for (var i = 0; i < len; i += 8)
        buff[buffCnt++] = len - i >= 8 ? Convert.ToByte(binaryString.Substring(i, 8), 2) : Convert.ToByte(binaryString.Substring(i), 2);
    buff[buffCnt] = (byte) binaryString.Substring((buff.Length - 2)*8).Length;

    return buff;
}

public string ToBinaryString(byte[] byteArray)
{
    var res = new StringBuilder(byteArray.Length*8);
    for (var i = 0; i < byteArray.Length - 2; i++)
        res.Append(Int32.Parse(Convert.ToString(byteArray[i], 2)).ToString("D8"));
    var octet = Convert.ToString(byteArray[byteArray.Length - 2], 2);
    res.Append(Int32.Parse(octet).ToString("D" + byteArray[byteArray.Length - 1]));

    return res.ToString();
}

public void Test()
{
    var testStr1 = "0000100100010101001001001101";
    var testStr2 = "00000000";
    var testStr3 = "0";

    if (
        ToBinaryString(ToByteArray(testStr1)).Equals(testStr1) &&
        ToBinaryString(ToByteArray(testStr2)).Equals(testStr2) &&
        ToBinaryString(ToByteArray(testStr3)).Equals(testStr3)
        )
        System.Diagnostics.Debug.Print("Win!");
    else
        System.Diagnostics.Debug.Print("Fail!");
}


byte[] mozes direktno da pises i citas iz fajla sa FileStream klasom.
Potpis
if it walks like a duck and quacks like a duck, it could be a dragon doing a duck
impersonation.
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme