[C++] Odczyt/zapis bit po bicie

0

Witam!
Czy jest możliwy binarny zapis do pliku bit po bicie? Wyczytałem, że możemy jedynie zapisywać 8 bitów, czy to prawda?

Prosiłbym o jakieś wskazówki/przykłady, w jaki sposób zapisać/odczytać bity z pliku i jak je potem interpretować.

Pozdrawiam, Ziem!

0

Wczytujesz jedno słowo char (najczęściej 8 bitów), a potem przy pomocy operatorów binarnych &, |, ^, ~ je modyfikujesz.

0

Najszybciej zrobic tak jak winefresh mowi, z tym ze albo wczytany bajt przeliczasz na system dwojkowy, np. zapisujac bity do 8-elementowej tablicy char, albo przesuwasz caly czas liczbe w prawo za pomoca operatora >> i porownujesz 1 bit operatorem chociazby tym & z jedynka, jesli zwroci prawde to masz 1, jesli nie to 0.
Zapis wyglada podobnie skladasz sobie bajcik jak chcesz i zapisujesz cale bajty lub alternatywnie piszesz sam funkcje zapisujaca po bicie do pliku ;)

0

Można jeszcze unie wykorzystać.

0

Dzięki za odpowiedzi!

Jeszcze się w to wszystko nie zagłębiałem, na razie szukam informacji. Postaram się to jeszcze bardziej sprecyzować.

Docelowo potrzebuję tego do algorytmu Huffmana.
Potrzebuję mieć możliwość zapisu/odczytu bitowego do pliku. Teraz tak, będę miał jakąś tablicę charów, która będzie zawierała kody dla poszczególnych liter (101..) i muszę "przekonwertować" to na bity i zapisać binarnie do pliku. Potem do odkodowania treści, będę te bity musiał odczytać i jakoś zinterpretować, czy mam 1 czy 0 (najlepiej odtworzyć tablicę charów).

Zapis i odczyt mogę zrobić za pomocą i(o)fstream z flagą ios_base::binary. Tylko tutaj pojawia się problem, jak z tablicy charów "zrobić" zestaw bitów gotowych do zapisu? Prosiłbym o jakieś wskazówki/rady/przykłady.

Widzę, że to może być dobry początek: http://www.cplusplus.com/reference/stl/bitset/bitset/ .

0

Twoj problem sprowadza sie do zamiany systemow liczbowych, wiec nie powinno byc z tym problemow, tutaj masz przyklad ode mnie, chociaz zastanawialem sie czy go wrzucac, bo na dobra sprawe bylo to juz walkowane kilka razy.

char *dec_to_bin(int n) {
	static char tab[32]; int i;

	for(i = 32; i; i--) {
		if(n & 1)
			tab[i-1] = '1';
		else
			tab[i-1] = '0';
		n >>= 1;
	}

        return tab;
}
0

Dzięki serdeczne! :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1