[C++] std::ios::binary, a odczyt pojedynczych bitów
Ostatnio zmodyfikowano 2016-01-20 18:37
Ziko Temat założony przez niniejszego użytkownika |
[C++] std::ios::binary, a odczyt pojedynczych bitów » 2016-01-18 20:57:38 Witam, Mam pytanie, nie rozumiem pewnej kwestii związanej z tym trybem otwierania pliku. Przykładowo otwierając plik ifstream source( "test.jpg", ios::binary );
Czy jest możliwość odczytu pojedynczych bitów (nie bajtów) oraz operowanie na nich w tym trybie? Prosił bym o wytłumaczenie mi tego. |
|
DejaVu |
» 2016-01-18 21:16:53 Wczytujesz bajtami i na bajtach wykonujesz operacje bitowe. Bajt jest najmniejszą jednostką odczytu/zapisu danych w pliku. |
|
pekfos |
» 2016-01-18 21:32:36 |
|
mateczek |
» 2016-01-18 21:40:36 http://www.cplusplus.com/reference/bitset/bitset/operator%5B%5D/A na własną rękę możesz tak (klasa odczyt bitu tylko ma !!!) #include <iostream> using namespace std; class bitsArray { int data; public: bitsArray( int _data = 0 ) { data = _data; } void operator =( int numer ) { data = numer; } bool operator []( int bitNumer ) { return data & 1 << bitNumer; } };
int main( void ) { bitsArray a = 255; for( int i = 0; i < 8; i++ ) cout << a[ i ]; cout << endl; } |
|
Ziko Temat założony przez niniejszego użytkownika |
» 2016-01-18 22:14:06 Dziękuje bardzo za szybkie odpowiedzi. Przestudiuje cały materiał jutro, bo jak to się mówi, dziś już padam na twarz. W zasadzie chodziło mi o odczyt po 6 bitów np. 111010 i zastąpieniem ich 101100, wszystko według określonych wytycznych. Jeszcze raz dziękuje |
|
mateczek |
» 2016-01-19 08:03:25 Zobacz jeszcze ten kod #include <iostream> using namespace std; typedef unsigned char BYTE; union { struct { BYTE value: 6; BYTE stat: 2; } tabbit; BYTE byte; } tabbit;
int main( void ) { tabbit.byte = 255; cout << "zakodowan wartosc wynosi" <<( int ) tabbit.tabbit.value << endl << "status = " <<( int ) tabbit.tabbit.stat << endl; }
|
|
Ziko Temat założony przez niniejszego użytkownika |
» 2016-01-19 21:52:39 Niestety zastosowanie tych kodów nic mi nie dało. Prawdopodobnie nie ogarniam tematu :) Tak na poważnie, przy zastosowaniu tego rozwiązania #include <iostream> using namespace std; typedef unsigned char BYTE; union { struct { BYTE value: 6; BYTE stat: 2; } tabbit; BYTE byte; } tabbit;
int main( void ) { tabbit.byte = 255; cout << "zakodowan wartosc wynosi" <<( int ) tabbit.tabbit.value << endl << "status = " <<( int ) tabbit.tabbit.stat << endl; }
bajt jest dzielony na dwie części, czyli 6 i 2 bity z liczby 255. W przypadku jednej liczby jest to dobrym rozwiązaniem, ale w przypadku ciągu znaków value jak i stat musiały by być zmieniane wraz z nowym znakiem. Dajmy na to, posiadam ciąg 00101011 0111000 11110000 rezultat jaki chciał bym uzyskać to 001010 110111 000111 1000 i tu dokonywać porównań lub innych działań. Jedynym sensownym rozwiązaniem jakie zdołałem wymyślić jest takie #include <iostream> #include <fstream> #include <conio.h> #include <string> using namespace std; int main() { ifstream plik( "test.bin", ios::in | ios::binary ); char c; while( plik.get( c ) ) { for( int i = 7; i >= 0; i-- ) cout <<(( c >> i ) & 1 ); } system( "pause" ); return 0; }
Niestety problemem jest konieczność zamiany jpg na bin jak i w przypadku zapisu do txt plik wyjściowy zwiększa się ośmiokrotnie w stosunku do orginału, co z kolei przy większych plikach nie jest dobre. Więc dlatego zastanawiałem się jak dobrać się do kodu binarnego jpg bez konieczności zamiany na bin i generowania większego pliku. |
|
pekfos |
» 2016-01-19 22:17:21 Wczytuj i przetwarzaj dane w porcjach wielkości najmniejszej wspólnej wielokrotności ośmiu i liczby bitów, jaka cię interesuje. Z tym podejściem, zadanie jest trywialne. Możesz to nawet zrobić strukturą z polami bitowymi. |
|
« 1 » 2 |