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)
> 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 > |