[ bciric @ 29.04.2010. 14:40 ] @
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
[ bciric @ 30.04.2010. 21:53 ] @
niko nema ideju kako to da uradim?
[ pl4stik @ 30.04.2010. 22:37 ] @
Definisi binarni file?
[ bciric @ 01.05.2010. 14:22 ] @
pa recimo da to bude .bin fajl u kome ce se zapamtiti ovi bitovi iz stringa, ali kao bitovi a ne kao char.
[ mmix @ 01.05.2010. 20:45 ] @
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.
[ kosmopolita @ 01.05.2010. 21:53 ] @
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.
[ lonelyrider_44 @ 02.05.2010. 00:22 ] @
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/
[ bciric @ 02.05.2010. 11:41 ] @
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
[ Boris B. @ 02.05.2010. 17:05 ] @
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.