Datastream
-
Hallo Zusammen!
Ich hab folgendes Problem:
Ich habe einen Buffer mit verschiedenen Werten drin:Buffer[] = {3,9,4,5...}Diese geben die Anzahl 1 oder 0 an welche ich in einen Datastream umwandeln muss. Also:
z.BBuffer[0]=3Ob es nun drei 1 oder drei 0 sind ist im Moment egal. Sagen wir einfach es sind drei 1.
Der Datastream ist 8 bit lang und ist auch ein Buffer.
Also:Datastream[] = {111xxxxx} {xxxxxxxx} ...Ich habe keine Ahnung wie ich das realisieren soll, denn die Werte welche im Buffer stehen, können alle länger als 8 sein.
Weiss jemand wie ich hier vorgehen könnte? Vielen Dank.
-
Ich hab ehrlich gesagt keine Ahnung was du da vorhast.

-
Skym0sh0 schrieb:
Ich hab ehrlich gesagt keine Ahnung was du da vorhast.

Also wenn ich zum Beispiel im Buffer solche Werte habe:
3,2,9,4,6,8...
dann soll im anderen Buffer (Datastream) das gepeichert werden:Datastream[0]= 11100111 Datastream[1]= 11111100 Datastream[2]= 00111111 Datastream[3]= 00000000
-
Messinho schrieb:
Skym0sh0 schrieb:
Ich hab ehrlich gesagt keine Ahnung was du da vorhast.

Also wenn ich zum Beispiel im Buffer solche Werte habe:
3,2,9,4,6,8...
dann soll im anderen Buffer (Datastream) das gespeichert werden:Datastream[0]= 11100111 Datastream[1]= 11111100 Datastream[2]= 00111111 Datastream[3]= 00000000drei mal ne 1, dann 2 mal ne 0, dann 9 mal ne 1 etc.
-
Also quasi immer abwechselnd?
Naja, sagen wir mal dir reichen als Zielwerte 0 oder 1, dann kannst du den boolschen Datentyp nehmen.
Ich würde dann zuerst anfangen mir einen Vector durchgehend zu befüllen und den danach in eine gewünschte Größe aufsplitten.
Etwa so:
int Buffer[] = {3, 2, 9, 4 /*...*/}; std::vector<bool> tempStream; // Stream füllen bool val = true; for(int i : Buffer) { tempStream.insert(std::end(tempStream), i, val); val = !val; } // DataStream erzeugen durch splitten des Streams int chunksize = 8; std::vector<std::vector<bool>> datastream; for(int i = 0; i < tempStream.size(); i +=chunksize) { std::vector<bool> tmp; for(int j = i; j < i+chunksize, j < tempStream.size(); ++j) { tmp.push_back(tempStream[j]); } datastream.push_back(tmp); }Achtung ! Ungetestet und kein schöner Code, ganz im Gegenteil, ziemlich hässlich und sehr spezialisiert sogar

Und nicht effizient, das geht besser
-
Hallo Messinho,
Willkommen im C++-Forum.
Dann meinst Du so was - oder:#include <iostream> #include <bitset> // nur für Demo-Zwecke (s.write) void write( unsigned char byte ) { std::cout << std::bitset<8>(byte) << std::endl; } int main() { using namespace std; int Buffer[] = {3,9,4,5,1,2,3}; unsigned char datastream=0; // Zeichen im DataStream int bitIdx = 0; int bit = 1; // starte mit '1' for( int l = 0; l < sizeof(Buffer)/sizeof(*Buffer); ++l, bit = 1-bit ) { for( int i=0; i < Buffer[l]; ++i ) { datastream <<= 1; datastream |= bit; if( ++bitIdx == 8 ) // datastream ist voll { write( datastream ); bitIdx = 0; } } } if( bitIdx > 0 ) write( datastream << (8-bitIdx) ); // restliche verbleibende Bits scheiben cout << endl; return 0; }Output:
11100000 00001111 00000100 11100000(getestet und mittel schöner Code)
Gruß
Werner
-
Zunächst einmal herzlichen Dank an euch für eure Hilfe. Ich muss jedoch gestehen, dass ich eher ein Anfänger bin und deshalb eure Code-Vorschläge nicht auf Anhieb verstanden habe.
@Werner
Ich verstehe nicht ganz was hier die Eintrittsbedingung ist:for( int l = 0; l < /*sizeof(Buffer)/sizeof(*Buffer)*/; ++l, bit = 1-bit )SOnst sieht dein Vorschlag ganz gut aus und könnte die fast schon ideale Lösung sein. Danke.
-
Messinho schrieb:
Ich verstehe nicht ganz was hier die Eintrittsbedingung ist:
for( int l = 0; l < /*sizeof(Buffer)/sizeof(*Buffer)*/; ++l, bit = 1-bit )Der Ausdruck 'sizeof(Buffer)' liefert Dir die Größe in Byte, die der Buffer belegt. Da er 7 int-Werte enthält und jeder int-Wert (in einer 32bit-Umgebung) 4 Byte groß ist, sollte das 4*7=28 sein. Was man hier haben will, ist aber die Anzahl der int-Werte, so dass die Lauf-variable 'l' von 0 bis 7-1=6 gehen kann. Also wird die Größe durch die Größe eines int-Werts geteilt. Und ein int-Wert ist hier '*Buffer', was der erste Wert im Buffer ist. sizeof(*Buffer) liefert also 4. Und 28/4 macht eben 7, also die Anzahl.
Warum macht man das?
Ein ganz wichtiger Punkt beim Programmieren im Allgemeinen ist das Vermeiden von Redundanzen. Betrachte dazu die Sequenz:int Buffer[] = {3,9,4,5,1,2,3}; size_t Anzahl = sizeof(Buffer)/sizeof(*Buffer);Du kannst jetzt ein Element im Buffer hinzu fügen, ohne etwas anderes ändern zu müssen. Auch kannst Du den Typ der Elemente ändern, ohne auf etwas anderes Rücksicht zu nehmen. Also z.B.:
short Buffer[] = {3,9,4,5,1,2,3,9,1,2,2,2,8}; size_t Anzahl = sizeof(Buffer)/sizeof(*Buffer);.. es ist alles noch so wie es sich der Programmierer am Anfang gedacht hat.
Ungünstig wäre z.B.:
const size_t Anzahl = 7; int Buffer[Anzahl] = {3,9,4,5,1,2,3};Fügst Du ein Element hinzu, so musst Du auch die Anzahl ändern. Vergisst Du eines von beiden, so macht der Code nicht mehr das, was Du denkst. Die 7 ist redundant zu der Anzahl der Elemete.
Gruß
Werner
-
Vielen Dank für deine Hilfe Werner!
