[ 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 @ 29.04.2010. 14:40 ] @
[ 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. Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|