Mailinglist Archive: opensuse-programming-de (158 mails)

< Previous Next >
Re: C++ -> einzelne Bits aus Datei lesen
  • From: Bodo Kaelberer <BodoKaelberer@xxxxxxxxxx>
  • Date: Sat, 17 May 2003 14:35:04 +0200
  • Message-id: <906054608.20030517143504@xxxxxxxxxx>
Hallo

> Es geht hier um video-Dateien ... also um einen Video decoder ... da
> braucht man den BIT-Stream ... wäre nicht besonders vorteilhaft,
> wenn das Video-File 8 mal so groß wird ... ;-) ... abgesehen davon
> muss ich mich ja an den Standard halten und der will es halt
> bitweise ...

Das ist ja ein nettes Thema fuer Einsteiger (-;

Wie gelesen: Bytes sind die kleinste Einheit.
Es gab auch glaub schon Loesungsvorschlaege, wie Du aus den Bytes Bits
machen kannst. Mein Vorschlag noch dazu (vielleicht gab es den auch
schon):

=================================================================
#include <iostream>

using namespace std;

bool byteToBit( unsigned char value, unsigned char &result ) {
static unsigned char andFlag = 0x01;
result = ( value & andFlag ) != 0 ? 0x01 : 0x00;
andFlag = andFlag << 1;
if ( andFlag == 0 ) { // Eine ganze Runde (8 shifts) gemacht?
andFlag = 0x01;
return true; // true = neues Byte noetig
}
else {
return false; // false = Weiter mit altem Byte
}
}


int main() {

unsigned char data[] = { 0x01, 0xF0, 0x34 }; // Dummy-Data

unsigned char currentByte;
unsigned char currentBit;
bool needNewByte;

for ( int i = 0; i < 3; i++ ) {
currentByte = data[i]; // Neues Byte holen. !!File-In!!
do {
needNewByte = byteToBit( currentByte, currentBit );
if ( currentBit )
cout << "1";
else
cout << "0";
} while ( !needNewByte );
cout << " ";
}

}
===============================================================

Die Funktion byteToBit() beginnt beim niedrigsten Bit. Willst Du mit
dem hoechsten beginnen, dann muss Du als Anfangswert 0x80 statt 0x01
verwenden und zum Schiften >> statt <<.

Ausgabe: 10000000 00001111 00101100

Das ist vom Aufruf her recht komfortabel. Es wirkt etwas umstaendlich,
aber dafuer hat es ein stream-artiges Verhalten - Du kannst wirklich
Bit fuer Bit lesen.
Die Performance kann ich nicht abschaetzen.

Bye

--
1 Bodo Kaelberer
123 http://www.webkind.de/
3
4 "A button I have made must be pushed." (ip)


< Previous Next >
Follow Ups