2012-07-16 31 views
7

Ich denke über das Schreiben einiger Daten in einen Bitstrom mit C. Es gibt zwei Möglichkeiten. Eine besteht darin, variable Bitlängensymbole in eine zusammenhängende Bitsequenz zu verketten, aber auf diese Weise wird es für meinen Decoder wahrscheinlich schwierig sein, diese Symbole von diesem kontinuierlichen Bitstrom zu trennen. Eine andere Möglichkeit besteht darin, die gleiche Anzahl von Bits für das Symbol zu verteilen, und auf diese Weise kann der Decodierer die Originaldaten leicht wiederherstellen, aber es kann eine Verschwendung von Bits geben, da die Symbole unterschiedliche Werte haben, die wiederum viele Bits im Bitstrom verursachen Null (diese Abfälle Bits denke ich).Wie schreibe ich einen Bitstrom

Irgendein Hinweis, was ich tun sollte?

Ich bin neu in der Programmierung. Jede Hilfe wird geschätzt.

+0

Hier ist meine Antwort zu ähnlich Frage hier: http: // stac koverflow.com/questions/11253123/how-can-i-print-a-bit-instead-of-byte-in-a-file/11253310#11253310 –

+0

Der übliche Weg ist das Packen der Bits, aber das erfordert Logik zu kenne die Bitzahl auf der anderen Seite. Sie könnten nach und nach dekodieren, um zu wissen, wann Sie das Ende eines Symbols erreicht haben. –

+1

Ihre Frage bezieht sich auf den Bereich der Codierung. Huffman-Codierung, wie unten erwähnt, ist eine Option. Aber es gibt andere als Huffman-Codierung ist nicht die einzige (aber es ist sicherlich die beliebteste). Siehe das Buch "Compression and Coding Algorithms" von Moffat und Turpin. Die meisten Komprimierungsbücher haben etwas mit Codierung; Dieses Buch konzentriert sich auf die Codierung. In Bezug auf "harte Zeit Trennung" benötigen Sie einen Code, der Präfix-frei ist - kein Code ist ein Präfix von jedem anderen. – Ray

Antwort

2

Klingt, als ob Sie etwas Ähnliches wie ein Huffman-Komprimierungsschema versuchen? Ich würde einfach byteweise (char) gehen und den Offset innerhalb des Bytes verfolgen, wo ich das letzte Symbol abgelesen habe.

Angenommen, keines Ihrer Symbole wäre größer als char. Es würde wie folgt aussehen:

struct bitstream { 
    char *data; 
    int data_size;   // size of 'data' array 
    int last_bit_offset;  // last bit in the stream 

    int current_data_offset; // position in 'data', i.e. data[current_data_offset] is current reading/writing byte 
    int current_bit_offset; // which bit we are currently reading/writing 
} 

char decodeNextSymbol(bitstream *bs) { 

} 

int encodeNextSymbol(bitstream *bs, char symbol) { 

} 

Der passende Code für decodeNextSymbol und encodeNextSymbol würde die C bitweise Operationen ('&' (bitweise AND), und verwenden Sie müssen '|' (bitweise OR) zum Beispiel ich. würde dann eine Liste aller meiner Symbole erstellen, beginnend mit der kürzesten zuerst, und mache eine while-Schleife, die mit dem kürzesten Symbol übereinstimmt.Wenn beispielsweise eines deiner Symbole '101' ist, dann ist der Strom '1011101' , würde es die erste "101" übereinstimmen und würde weiterhin den Rest des Streams "1101" passen Sie müssten auch den Fall behandeln, wo Ihre Symbolwerte von einem Byte zum nächsten überlaufen.

Verwandte Themen