Forum: Compiler & IDEs Bitstrom erzeugen in C


von Rainer K. (Gast)


Lesenswert?

Hallo Community,

ich möchte in C (Betriebssystem unabhänig, auf einem Mikrocontroller) 
soetwas wie einen Bitstream erzeugen.

Beispiel:
uint8_t streamArray[100];

Nun möchte ich in dieses Array bits "streamen..." Ich stelle mir das so 
vor, dass ich an die Zugriffsfuntion immer 1 Byte übergebe zusammen mit 
der anzahl der Bits die aus diesem Byte gespeichert werden sollen. Die 
Funktion hängt die beschriebenen Bits dann an den Stream an.

Die Umsetzung dürfte nicht so kompliziert sein, wenn man dann aber noch 
Funtionalitäten wie padding, kompression usw. haben möchte wirds aber 
doch schnell komplexer im Umfang. So etwas wie Streamobjekte wären 
super.

Ich wollte einfach mal fragen ob jemand vielleicht ne fertige Klasse 
hierzu hat. Eigentlich bin ich mir sicher, dass fast jeder Audiocodec 
soetwas beinhalten müsste und da gibt es doch viele die open Source 
sind, vielleicht schau ich auch mal da rein...

Ich bin für Tipps dankbar!

von Rainer K. (Gast)


Lesenswert?

Ah sorry, ich meinte nicht "Klasse" (brauch das nicht in C++) sondern 
Modul oder Lib.

von Nico22 (Gast)


Lesenswert?

Wo soll der Stream denn hin? Guck mal unter Ringpuffer.

Nico.

von Rainer K. (Gast)


Lesenswert?

@Nico 22: Also das soll quasi an eine Speicherstelle die ich definiere, 
zB das byte array.

Also ich hab inzwischen was gefunden: 
http://www.koders.com/c/fid46B07257984E46E374FBD93AED1146BADABE9BD3.aspx?s=search 
Ein Teil der Lib enthält genau das was ich brauche. Bin mir nicht ganz 
sicher wie das mit der Lizenz ist, oben steht LGPL, im Copyright vermerk 
steht dann nix mehr dazu. Aber ich glaub für nen Studienprojekt sollte 
ich das schon nehmen dürfen, oder?

Mich wundert es im übrigen dass es so schwer war solche Funktionen zu 
finden, scheint mir kein übermässiger Spezialfall zu sein.

von Karl H. (kbuchegg)


Lesenswert?

Rainer K. schrieb:
> @Nico 22: Also das soll quasi an eine Speicherstelle die ich definiere,
> zB das byte array.

Wenn du es allgmein haben willst, dann verfügt dein Stream-Modul über 
einen Funktionspointer. Jedesmal wenn es ein Byte fertig zusammengesetzt 
hat, setzt es dieses Byte über diesen Funktionspointer ab.

Das kann man dann auch weiter treiben.
Ein 2-tes Modul, welches über eine Funktion ein Byte entgegennimmt und 
es durch die Kompression jagt und seinerseits wieder über einen 
Funktionspointer verfügt, über welchen es ein Byte aus dem 
Kommpressionsergebnis loswird. (sofern das Komressionsverfahren so 
aufgebaut ist, dass man nicht auf ältere Bytes rückgreifen muss)

Jubelt man daher dem Stream Modul die Input Funktion des 
Kompressions-Modul als Ausgabefunktion unter, dann hat man ein 
Kombinationsobjekt geschaffen, welches man als einen Stream ansehen 
kann, der auch kompremiert.

Dazu dann noch eine Funktion, die eintreffende Bytes einfach 
nacheinander im Speicher ablegt. Und diese Funktion jubelt man dann 
wiederrum dem Kompressionsmodul als Ausgabefunktion unter.
(Oder eine Funktion die ein Byte auf ein File schreibt oder eine 
Funktion die das Byte in einen Netzwerksocket stopft oder ....)

> Mich wundert es im übrigen dass es so schwer war solche Funktionen zu
> finden, scheint mir kein übermässiger Spezialfall zu sein.

Keine Ahnung.
Bits in einem Byte sammeln und das Byte auf eine Ausgabestrecke zu 
bringen klingt jetzt nicht so übermässig kompliziert als das ich da 
lange danach suchen würde.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.