Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Java/C++]Zapis bitów do pliku
Forum PHP.pl > Forum > Gotowe rozwiązania > Algorytmy, klasy, funkcje
MateuszS
Witam, mam taki problem, bo muszę string "0101" itp. przekonwertować na bity (?) i zapisać do pliku .bin. Ponoć wtedy plik mniej zajmuje. Średnio wiem o co w tym biega i nie znalazłem w internecie wartościowych treści na ten temat. Chodzi mi głównie o teoretyczne wyjaśnienie zagadnienia - implementacją zajmę się sam. Po poprawnym zapisie do pliku mają w nim być "krzaki". Taki plik powinno się także dać z powrotem przekonwertować na ów string zero-jedynkowy lub przynajmniej na pojedyncze 1 lub 0. Będę wdzięczny za pomoc.
MateuszS
Chyba niekoniecznie. Dalej zapisuje mi w postaci stringowej do pliku. 2 metody to by było za prosto chyba. Może plik trzeba jakoś binarnie otworzyć, nie wie wiem za bardzo. Powinny się w pliku krzaki pojawić a nadal mam String
Crozin
Magicznej kuli nie mam - pokaż kod.
d3ut3r
Nie wiem na ile to jest aktualne w świetle najnowszej wersji Java

http://www.javapractices.com/topic/TopicAction.do?Id=245

generalnie hasło Java binary files zwraca sporo rezultatów, niestety bardziej pomocny nie będę Ostatni raz z Java miałem styczność jakiś czas temu na studiach smile.gif

MateuszS
Rozumiem. Ja właśnie studiuję smile.gif Niestety mamy Javę prowadzoną w sposób - "poczytajcie w internecie a na zajęciach was odpytam". Crozin, he tu nie chodzi o kod, kod tu nic nie da bo kodu nie ma. Chodzi bardziej o teoretyczny aspekt tego. No nic, jakoś się jutro wytłumaczę, dobrze że nie ja jeden biggrin.gif Dzięki i pzdr.
Crozin
Masz zamienić tekst (obiekt String) "0101111001100101" (16 znaków; w zależności od użytego kodowania od minimum 16 bajtów do 64 bajtów) na tablicę bajtów, w tym przypadku będzie to:
  1. byte[] dane = new byte[] { 0x5e /* bity: 01011110 */, 0x65 /* bity: 01100101 */ };
Taka tablica jak widać zajmuje zaledwie 2 bajty, a jest w stanie dostarczyć dokładnie tych samych informacji.
Następnie przy odczycie z pliku *.bin, masz za zadanie zamienić taką tablicę bajtów na tekst.

Dwie funkcje podane przez @d3ut3r pozwolą Ci na konwersję pomiędzy pojedynczym bajtem, a tekstem. Jeżeli zaś chodzi o sam odczyt i zapis danych do pliku, możesz skorzystać z DataInputStreama oraz DataOutputStreama.

PS. W przypadku gdyby istniała możliwość, że ciąg wejściowy (tekst złożony ze znaków zera i jedynki) ma długość niepodzielną przez 8 musiałbyś na początku swojego pliku *.bin zapisać długość "zakodowanego" ciągu. Jest to konieczne, ponieważ dla przykładowego ciągu "00110", wynikiem będzie tablica złożona z zaledwie jednego elementu byte:
  1. byte[] dane = new byte[] { 0x6 };
Jednak po zapisie do pliku, będziesz miał tam (tutaj podane są poszczególne bity):
Kod
00000110
Ponieważ byte ma długość jednego bajtu, tj. 8 bitów.
MateuszS
Świetnie napisane, dzięki teraz wszystko rozumiem. Jakby co dam znać

Jeżeli mam String złożony z 8 elementów np. "10101010" (czyli dec 170), mogę go sobie przekonwertować jakoś na postać 0xC2,0xAA ? Bo tam w tablicę muszę to wpisać w takiej postaci prawda?
Crozin
http://ideone.com/OAgaDU
MateuszS
Dzięki robiłem tak, tylko nie wiedziałem o co chodzi z tym Radixem jak nie dawałem tej 2

Hmm, zapisuje niestety tylko 7 znakowe stringi, czyli 7/8 miejsc zajętych, 1 bit się marnuje ale jest jakaś kompresja przynajmniej ;]

Crozin
Ah, rzeczywiście Byte.parseByte() będzie tutaj mało pomocne. Pogoogleaj za "java binary string to byte array"
MateuszS
Nie no dobrze jest bo z pliku 4.5mb robi mi się 2 megowy i mogę go sobie kodować i dekodować na dane wyjściowe. Kompresja tego pliku jest na poziomie 50% więc nie jest źle, ludzie gorszą kompresję mieli. co prawda można by jakoś osiągnąć wyższą ale na moje potrzeby wystarczy.
Crozin
Powinieneś uzyskać plik o 8-krotnie mniejszej objętości - pokaż kod.
MateuszS
Sorki że nie odpisałem, już wszystko ok, tzn. zaliczone. smile.gif Nie do końca działa jak miało działać ale już po wszystkim. Dzięki
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2024 Invision Power Services, Inc.