Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] std::ios::binary, a odczyt pojedynczych bitów

Ostatnio zmodyfikowano 2016-01-20 18:37
Autor Wiadomość
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

C/C++
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.



P-143754
DejaVu
» 2016-01-18 21:16:53
Wczytujesz bajtami i na bajtach wykonujesz operacje bitowe. Bajt jest najmniejszą jednostką odczytu/zapisu danych w pliku.
P-143756
pekfos
» 2016-01-18 21:32:36
Zapis binarny
Masz tu całą niezbędną teorię (chyba).
P-143761
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 !!!)
C/C++
#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;
   
}
P-143762
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
P-143765
mateczek
» 2016-01-19 08:03:25
Zobacz jeszcze ten kod
C/C++
#include <iostream>
using namespace std;
typedef unsigned char BYTE; // 1byte
union {
    struct {
        BYTE value: 6; //6 bitów w bajcie
        BYTE stat: 2; //2 bity w bajcie
    } tabbit;
    BYTE byte; //dostęp do bajtu
} tabbit;


int main( void )
{
    tabbit.byte = 255;
    cout << "zakodowan wartosc wynosi" <<( int ) tabbit.tabbit.value << endl << "status = " <<( int ) tabbit.tabbit.stat << endl;
}
P-143771
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

C/C++
#include <iostream>
using namespace std;
typedef unsigned char BYTE; // 1byte
union {
    struct {
        BYTE value: 6; //6 bitów w bajcie
        BYTE stat: 2; //2 bity w bajcie
    } tabbit;
    BYTE byte; //dostęp do bajtu
} 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

C/C++
#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.
P-143796
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.
P-143798
« 1 » 2
  Strona 1 z 2 Następna strona